聊天TCP不会发送给两个客户端

时间:2018-01-16 22:59:29

标签: java tcp chat

我正在尝试创建TCP聊天。我的问题是,如果有2个用户进行聊天,每次我在聊天中写一条消息时,我都会被发送到服务器,但其他聊天却没有。我不知道为什么有人可以这样帮助我。我把代码留在这里。

如果我在聊天中写信,它会发送给我(见图) enter image description here

但是当我在另一个聊天中写字时,我没有被发送(见图片) enter image description here

客户端

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) {

    }

}

}

0 个答案:

没有答案