Olá pessoal,
estou com um problema no meu cliente, eu implementei a interface WindowListener para que quando o usuário fechar a janela a conexão seja fechada com o servidor também, porem quando eu fecho a janela estou tendo varias exception retornadas, tem algo de errado?
[code]import java.io.;
import java.net.;
import java.util.;
import javax.swing.;
import java.awt.;
import java.awt.event.;
class SimpleChatClient {
JTextArea incoming;
JTextField outgoing;
BufferedReader reader;
PrintWriter writer;
Socket sock;
public static void main(String[] args) {
SimpleChatClient client = new SimpleChatClient();
client.go();
}
public void go() {
JFrame frame = new JFrame("Chat Cliente");
JPanel mainPanel = new JPanel();
incoming = new JTextArea(15,50);
incoming.setLineWrap(true);
incoming.setWrapStyleWord(true);
incoming.setEditable(false);
JScrollPane qScroller = new JScrollPane(incoming);
qScroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
qScroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
outgoing = new JTextField(20);
JButton sendButton = new JButton("Enviar");
sendButton.addActionListener(new SendButtonListener());
mainPanel.add(qScroller);
mainPanel.add(outgoing);
mainPanel.add(sendButton);
setUpNetworking();
Thread readerThread = new Thread(new IncomingReader());
readerThread.start();
frame.getContentPane().add(BorderLayout.CENTER, mainPanel);
frame.setSize(400,500);
frame.setVisible(true);
}
private void setUpNetworking() {
try {
sock = new Socket("127.0.0.1", 5000);
InputStreamReader streamReader = new InputStreamReader(sock.getInputStream());
reader = new BufferedReader(streamReader);
writer = new PrintWriter(sock.getOutputStream());
System.out.println("Conexao Estabelecida");
} catch (IOException ex) {
ex.printStackTrace();
}
}
class SendButtonListener implements ActionListener {
public void actionPerformed(ActionEvent ev) {
try {
writer.println(outgoing.getText());
writer.flush();
} catch (Exception ex) {
ex.printStackTrace();
}
outgoing.setText("");
outgoing.requestFocus();
}
}
class IncomingReader implements Runnable {
public void run() {
String message;
try {
while ((message = reader.readLine()) != null) {
System.out.println("read " + message);
incoming.append(message + "\n");
}
}
catch (Exception ex) { ex.printStackTrace(); }
}
}
}
[/code]
Achei estranho pq para fechar uma conexão, pelo que eu saiba, é só dar um close() no soquete.
O meu servidor também estou tendo problemas, não consegui fazer com que ele decremente o “i” quando um cliente se desconectar do servidor, existe algum metodo pra saber quando um cliente desconectou do servidor. Estou usando threads para aceitar varias conexões, porem como podem ver no codigo eu só consigo incrementar o “i” a cada conexão recebida.
import java.io.*;
import java.net.*;
import java.util.*;
/* Como este fonte usa certas coisas inseguras do java deve se usar a sintaxe
javac -source 1.4 VerySimpleChatServer2.java
para compilar este fonte.
*/
class VerySimpleChatServer2 {
ArrayList clientOutputStreams;
int i = 0;
public class ClientHandler implements Runnable {
BufferedReader reader;
Socket sock;
public ClientHandler(Socket clientSocket) {
try {
sock = clientSocket;
InputStreamReader isReader = new InputStreamReader(sock.getInputStream());
reader = new BufferedReader(isReader);
} catch (Exception ex) {
//ex.printStackTrace();
System.out.println("Alguem saiu");
}
}
public void run() {
String message;
try {
while ((message = reader.readLine()) != null) {
System.out.println("read " + message);
tellEveryone(message);
}
} catch (Exception ex) { ex.printStackTrace(); }
}
}
public static void main(String[] args) {
new VerySimpleChatServer2().go();
}
public void go() {
clientOutputStreams = new ArrayList();
try {
ServerSocket serverSock = new ServerSocket(5000);
while (true) {
ArrayList dados = new ArrayList();
Socket clientSocket = serverSock.accept();
PrintWriter writer = new PrintWriter(clientSocket.getOutputStream());
clientOutputStreams.add(writer);
Thread t = new Thread(new ClientHandler(clientSocket));
t.start();
System.out.println("Recebeu uma conexao");
i++;
}
} catch (Exception ex) {
//ex.printStackTrace();
System.out.println("Alguem saiu");
}
}
public void tellEveryone(String message) {
Iterator it = clientOutputStreams.iterator();
while (it.hasNext()) {
try {
PrintWriter writer = (PrintWriter) it.next();
writer.println(message);
writer.flush();
System.out.println("Temos "+i+" conexoes");
} catch (Exception ex) {
//ex.printStackTrace();
System.out.println("Alguem saiu");
}
}
}
}