Boa noite pessoal,
Estou pelejando para fazer um chat bem tosco para fins de estudo e estou com dificuldade de entender o que ocorre.
No geral eu tenho 3 classes: Servidor, Cliente, Principal(interface com usuário), e estou querendo fazer como se fosse no padrão MVC
O meu servidor e cliente estão se comunicam blz, mas acontece o seguinte.
Quando o servidor vai responder, o usuário que escreveu a mensagem não recebe a mesma, somente os demais usuários. Eu fiz tentando fazer uma adaptação de um tutorial do próprio GUJ. Só que neste tutorial a interface fica dentro do cliente.
Outra coisa que acontece é q quando eu clico no botão Enviar fica travado e só destrava quando o outro usuário clica no enviar, aí eu recebo a mensagem dele e ele recebe a minha.
Poderiam me ajudar?
Servidor:
package control;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.Vector;
import javax.swing.JOptionPane;
public class Servidor extends Thread{
// Controla as conexões por Threads
private static Vector clientes;
// Socket do cliente
private Socket socket;
// Nome do cliente
private String nomeCliente;
// Lista que armazena nome dos clientes
private static List listaNomes = new ArrayList();
// Construtor que recebe socket do cliente
public Servidor(Socket socket){
this.socket = socket;
}
public static void main(String args[]) {
// Instancia o vetor de clientes conectados
clientes = new Vector();
try {
ServerSocket serverSocket = new ServerSocket(80);
//Socket socket = serverSocket.accept();
for (;;) {
Socket socket = serverSocket.accept();
Thread tCliente = new Servidor(socket);
tCliente.start();
}
} catch (Exception e) {
System.out.println(e);
System.out.println("Erro servidor");
}
}
public void run(){
try {
DataInputStream in = new DataInputStream(socket
.getInputStream());
DataOutputStream out = new DataOutputStream(socket
.getOutputStream());
clientes.add(out);
String msg = in.readUTF();
while(msg != null){
sentToAll(out, "fala: ", msg);
msg = in.readUTF();
}
this.socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void sentToAll(DataOutputStream out, String acao, String msg){
Enumeration e = clientes.elements();
while(e.hasMoreElements()){
DataOutputStream outTodos = (DataOutputStream) e.nextElement();
if(outTodos != out){
try {
outTodos.writeUTF(this.nomeCliente + acao + msg);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
}
}
Cliente:
package control;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.JOptionPane;
import javax.swing.JTextArea;
public class Cliente {
Socket client;
public Cliente(){
try {
client = new Socket("192.168.0.101", 80);
} catch (UnknownHostException e) {
JOptionPane.showMessageDialog(null, "Excessão host exception");
e.printStackTrace();
} catch (IOException e) {
JOptionPane.showMessageDialog(null, "Excessão IO exception");
e.printStackTrace();
}
}
public void enviaMSG(JTextArea txtArea, String msg){
try {
DataInputStream in = new DataInputStream(client.getInputStream());
DataOutputStream out = new DataOutputStream(client.getOutputStream());
out.writeUTF("Teste diz: " + msg);
String s = in.readUTF();
txtArea.append(s + "\n");
}catch (Exception e){
System.out.println(e);
JOptionPane.showMessageDialog(null, "Não foi possivel conectar com o servidor");
}
}
}
Evento do botão Enviar:
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals("Enviar")){
String msg = "";
msg = txtMensagem.getText();
c.enviaMSG(txtaConversa, msg);
txtMensagem.setText("");
}
}
Obrigado!