我正在开发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;
}
}
}
}