我正在尝试创建TCP聊天。我的问题是,如果有2个用户进行聊天,每次我在聊天中写一条消息时,我都会被发送到服务器,但其他聊天却没有。我不知道为什么有人可以这样帮助我。我把代码留在这里。
客户端
public class Cliente extends JFrame {
public Cliente() {
setBounds(600, 300, 280, 400);
LaminaMarcoCliente milamina = new LaminaMarcoCliente();
add(milamina);
setVisible(true);
}
}
class LaminaMarcoCliente extends JPanel implements Runnable {
private JTextField campo1, nick, ip;
private JButton miboton;
private JTextArea areadechat;
public LaminaMarcoCliente() {
nick = new JTextField(5);
add(nick);
JLabel texto = new JLabel("CLIENTE");
add(texto);
ip = new JTextField(10);
add(ip);
areadechat = new JTextArea(16, 21);
add(areadechat);
campo1 = new JTextField(20);
add(campo1);
miboton = new JButton("Enviar");
EnviaTexto mievento = new EnviaTexto();
miboton.addActionListener(mievento);
add(miboton);
Thread hilocliente = new Thread(this);
hilocliente.start();
}
private class EnviaTexto implements ActionListener {
private DataOutputStream flujoDeSalida;
@Override
public void actionPerformed(ActionEvent e) {
try {
Socket socketcliente = new Socket("Localhost", 9999);
//Instancio la clase Mensaje
Mensaje mensaje = new Mensaje();
//Utilizo los getter y setters Clase Mensaje y pasamos lo que hay escrito en el cuadro de texto nick, ip y mensaje
mensaje.setNick(nick.getText());
mensaje.setMensaje(campo1.getText());
//Utilizamos ObjectStream para enviar un objeto
ObjectOutputStream datos = new ObjectOutputStream(socketcliente.getOutputStream());
//Indicamos el objeto que queremos enviar
datos.writeObject(mensaje);
socketcliente.close();
/*flujoDeSalida= new DataOutputStream(socketcliente.getOutputStream());
//Escribe en el flujo lo que hay en el campo1
flujoDeSalida.writeUTF(campo1.getText());
//Cerramos flujo salida
flujoDeSalida.close();*/
} catch (IOException ex) {
System.out.println(ex.getMessage());
}
}
}
@Override
public void run() {
try{
//Ponemos a la escucha el cliente
ServerSocket escucha = new ServerSocket(9090);
//Creamos un canal para recibir el paquete
Socket cliente;
Mensaje paqueteRecibido;
while(true){
//Aceptamos todos los mensajes (Conexiones)
cliente = escucha.accept();
//Creamos un flujo de datos de entrada para transportar objetos
ObjectInputStream entrada = new ObjectInputStream(cliente.getInputStream());
//Leemos lo que hay en el interior
paqueteRecibido = (Mensaje) entrada.readObject();
//Lo escribimos en el area de texto
areadechat.append("\n"+paqueteRecibido.getNick()+": "+paqueteRecibido.getMensaje());
}
}catch(Exception e){
System.out.println(e.getMessage());
}
}
}
class server:
class Servidor extends JFrame implements Runnable {
private JTextArea areatexto;
private DataInputStream flujoDeEntrada;
private String cadenaRecibe = null;
public Servidor() {
setBounds(1200, 300, 280, 350);
JPanel milamina = new JPanel();
milamina.setLayout(new BorderLayout());
areatexto = new JTextArea();
milamina.add(areatexto, BorderLayout.CENTER);
add(milamina);
setVisible(true);
Thread mi_hilo = new Thread(this);
mi_hilo.start();
}
@Override
public void run() {
System.out.println("Servidor:Estoy a la escucha");
try {
ServerSocket servidor = new ServerSocket(9999);
String nick, ip, mensaje;
//Creamos la instancia mensaje para recibir los datos
Mensaje recibir;
while (true) {
//Aceptar las conexiones del cliente (Exterior)
Socket misocket = servidor.accept();
//Creamos un Objectinput para recibir los datos
ObjectInputStream datos = new ObjectInputStream(misocket.getInputStream());
//Meter dentro del objeto datos lo que le llega por la red
recibir = (Mensaje) datos.readObject();
//Accedemos a la informacion que hay dentro del paquete donde esta el nick,ip y el mensaje
nick = recibir.getNick();
mensaje = recibir.getMensaje();
/*flujoDeEntrada = new DataInputStream(misocket.getInputStream());
//Almacenamos el texto del cliente
cadenaRecibe= flujoDeEntrada.readUTF();
//Agregar el texto que recibe al textarea
areatexto.append("\n"+cadenaRecibe);*/
areatexto.append("\n" + nick + ": " + mensaje);
//Creamos otro oscket para que viaje la informacion
Socket destinatario = new Socket("",9090);
//Enviamos el paquete
ObjectOutputStream reenvio = new ObjectOutputStream(destinatario.getOutputStream());
//Metemos la informacion que vamos a enviar en el ObjectOutput
reenvio.writeObject(recibir);
reenvio.close();
//Cerramos socket
destinatario.close();
//Cerramos conexion
misocket.close();
}
} catch (IOException ex) {
} catch (ClassNotFoundException ex) {
}
}
}