SSL聊天问题

时间:2018-02-22 16:30:49

标签: java

我正在开发SSL聊天,我有一些问题要解决连接问题。控制台打印连接失败。我已经完成了证书,但连接失败了。

第一个问题出现在Class Cliente聊天的83行中,那是写文本的框架

代码:

    private SSLSocketFactory factory= (SSLSocketFactory) SSLSocketFactory.getDefault();
    private SSLSocket socket;
    private MensajesChat mensajes;
    private DataInputStream entradaDatos;
    private DataOutputStream salidaDatos;

    public ConexionCliente(SSLSocket socket, MensajesChat mensajes) {
        this.socket=socket;
        this.mensajes= mensajes;



        try {
            entradaDatos = new DataInputStream(socket.getInputStream());
            salidaDatos = new DataOutputStream(socket.getOutputStream());
        }catch(IOException ex) {
            ex.printStackTrace();
        }
    }




    public void run() {
        String mensajeRecibido;
        boolean conectado = true;
        //apuntandose a la lista de observadores del mensaje
        mensajes.addObserver(this);

        while(conectado) {
            try {

                //Lee el mensaje enviado por el cliente
                mensajeRecibido = entradaDatos.readUTF();
                //Pone el mensaje recibido en mensajes para que se notifique a los obervadores
                mensajes.setMensaje(mensajeRecibido);
            }catch(IOException e) {
                e.printStackTrace();
                conectado=false;
                //si hay un error de conexion se corta de cuajo
                try {
                    entradaDatos.close();
                    salidaDatos.close();
                }catch(IOException ex2) {
                    ex2.printStackTrace();
                }
            }
        }
    }


    @Override
    public void update(Observable o, Object arg) {
        try {
            //Envia el mensaje al cliente
            salidaDatos.writeUTF(arg.toString());

        }catch(IOException ex) {
            ex.printStackTrace();
        }

    }



    package Servidor;

import java.util.Observable;

public class MensajesChat extends Observable{



    private String mensaje;

    public MensajesChat() {

    }

    public String getMensaje() {
        return mensaje;
    }


    public void setMensaje(String mensaje) {
        this.mensaje= mensaje;
        //Hay que indicar que el mensaje ha cambiado com el metodo de Observable setChanged()
        this.setChanged();
        //Despues hay que notificar el cambio a todos los objetos observadores
        //notifyObserver llama al metodo Update del observador
        this.notifyObservers(this.mensaje);
    }


}





    private SSLSocketFactory factory= (SSLSocketFactory) SSLSocketFactory.getDefault();
    private SSLSocket socket;
    private MensajesChat mensajes;
    private DataInputStream entradaDatos;
    private DataOutputStream salidaDatos;

    public ConexionCliente(SSLSocket socket, MensajesChat mensajes) {
        this.socket=socket;
        this.mensajes= mensajes;



        try {
            entradaDatos = new DataInputStream(socket.getInputStream());
            salidaDatos = new DataOutputStream(socket.getOutputStream());
        }catch(IOException ex) {
            ex.printStackTrace();
        }
    }




    public void run() {
        String mensajeRecibido;
        boolean conectado = true;
        //apuntandose a la lista de observadores del mensaje
        mensajes.addObserver(this);

        while(conectado) {
            try {

                //Lee el mensaje enviado por el cliente
                mensajeRecibido = entradaDatos.readUTF();
                //Pone el mensaje recibido en mensajes para que se notifique a los obervadores
                mensajes.setMensaje(mensajeRecibido);
            }catch(IOException e) {
                e.printStackTrace();
                conectado=false;
                //si hay un error de conexion se corta de cuajo
                try {
                    entradaDatos.close();
                    salidaDatos.close();
                }catch(IOException ex2) {
                    ex2.printStackTrace();
                }
            }
        }
    }


    @Override
    public void update(Observable o, Object arg) {
        try {
            //Envia el mensaje al cliente
            salidaDatos.writeUTF(arg.toString());

        }catch(IOException ex) {
            ex.printStackTrace();
        }

    }




    public class ConexionServidor implements ActionListener {


    private SSLSocket socket;
    private JTextField tfMensaje;
    private String usuario;
    private DataOutputStream salidaDatos;


    public ConexionServidor(SSLSocket socket, JTextField tfMensaje, String usuario) {
        this.socket=socket;
        this.tfMensaje= tfMensaje;
        this.usuario= usuario;
        try {
            this.salidaDatos = new DataOutputStream(socket.getOutputStream());
        }catch(IOException e) {
            e.printStackTrace();
        }catch(NullPointerException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void actionPerformed(ActionEvent e) {
         try {
                salidaDatos.writeUTF(usuario + ": " + tfMensaje.getText() );
                tfMensaje.setText("");
            } catch (IOException ex) {
                ex.printStackTrace();
            }
    }

}





    public class ClienteChat extends JFrame{


    private SSLSocket socket;

    private int puerto;
    private String host;
    private String usuario;
    private JTextField textField;
    JTextArea textArea ;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    new ServidorChat();
                    ClienteChat frame = new ClienteChat();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public ClienteChat() {
        super("Cliente chat");

            System.setProperty("javax.net.ssl.trustStore","UsuarioAlmacenSSL");
            System.setProperty("javax.net.ssl.trustStorePassword","890123");

            getContentPane().setLayout(null);

            JButton btnNewButton = new JButton("New button");
            btnNewButton.setBounds(453, 319, 117, 29);
            getContentPane().add(btnNewButton);

            textField = new JTextField();
            textField.setBounds(21, 319, 420, 26);
            getContentPane().add(textField);
            textField.setColumns(10);

            JScrollPane scrollPane = new JScrollPane();
            scrollPane.setBounds(21, 18, 549, 258);
            getContentPane().add(scrollPane);

            textArea = new JTextArea();
            scrollPane.setViewportView(textArea);
            textArea.setEnabled(false); // El area de mensajes del chat no se debe de poder editar
            textArea.setLineWrap(true); // Las lineas se parten al llegar al ancho del textArea
            textArea.setWrapStyleWord(true); // Las lineas se parten entre palabras (por los espacios blancos)

            VentanaConfiguracion vc = new VentanaConfiguracion(this);
            host = "localhost";
            puerto = 1234;
            usuario = vc.getUsuario();

            // Se crea el socket para conectar con el Sevidor del Chat
            try {
                SSLSocketFactory factory=(SSLSocketFactory)SSLSocketFactory.getDefault();
            socket = (SSLSocket) factory.createSocket(host, puerto);
            } catch (UnknownHostException ex) {
                ex.printStackTrace();
            } catch (IOException ex) {
                ex.printStackTrace();
            }

            // Accion para el boton enviar
            btnNewButton.addActionListener(new ConexionServidor(socket, textField, usuario));



    }


      public void recibirMensajesServidor(){
            // Obtiene el flujo de entrada del socket
            DataInputStream entradaDatos = null;
            String mensaje;
            try {
                entradaDatos = new DataInputStream(socket.getInputStream());
            } catch (IOException ex) {
               ex.printStackTrace();
            } catch (NullPointerException ex) {
               ex.printStackTrace();
            }

            // Bucle infinito que recibe mensajes del servidor
            boolean conectado = true;
            while (conectado) {
                try {
                    mensaje = entradaDatos.readUTF();
                    textArea.append(mensaje + System.lineSeparator());
                } catch (IOException ex) {
                    ex.printStackTrace();
                    conectado = false;
                } catch (NullPointerException ex) {
                   ex.printStackTrace();
                    conectado = false;
                }
            }
        }
}

0 个答案:

没有答案