Efectivamente eso era Fuzzylog, tuve que rediseñar mi ventana cliente, ahora tengo otro problema, en mi servidor se acepta varias conexiones de clientes, pero cuando mando a llamar la ventana de bloqueo lo hace para todos al igual que si lo oculto, la cosa es que quisiera que solo se ejecute para una maquina en especifico:
Mi codigo de servidor es este:
Código Java:
Ver originalpublic class PrincipalChat
extends JFrame{ public JTextField campoTexto
; //Para mostrar mensajes de los usuarios public JTextArea areaTexto
; //Para ingresar mensaje a enviar private static Socket conexion
; //Socket para conectarse con el cliente private static String ip
; //ip a la cual se conecta private static final int maxClientsCount = 10;
private static final ThreadEnvia[] threads = new ThreadEnvia[maxClientsCount];
public static PrincipalChat main;
super("Mi Control Cyber - Servidor"); //Establece titulo al Frame
ip=address.getHostAddress();
campoTexto
= new JTextField(); //crea el campo para texto campoTexto.setEditable(false); //No permite que sea editable el campo de texto
add
(campoTexto,
BorderLayout.
NORTH); //Coloca el campo de texto en la parte superior
areaTexto
= new JTextArea(); //Crear displayArea areaTexto.setEditable(false);
areaTexto.
setBackground(Color.
orange); //Pone de color cyan al areaTexto areaTexto.
setForeground(Color.
BLACK); //pinta azul la letra en el areaTexto campoTexto.
setForeground(Color.
BLACK); //pinta toja la letra del mensaje a enviar
//Crea menu Archivo y submenu Salir, ademas agrega el submenu al menu
menuArchivo.add(salir); //Agrega el submenu Salir al menu menuArchivo
setJMenuBar(barra); //Agrega barra de menus a la aplicacion
barra.add(menuArchivo); //agrega menuArchivo a la barra de menus
//Accion que se realiza cuando se presiona el submenu Salir
salir.
addActionListener(new ActionListener() { //clase interna anonima System.
exit(0); //Sale de la aplicacion }
});
setSize(400, 400); //Establecer tamano a ventana
setVisible(true); //Pone visible la ventana
setResizable(false);//no permite redimencionar
}
//Para mostrar texto en displayArea
public void mostrarMensaje
(String mensaje
) { areaTexto.append(mensaje + "\n");
}
public void habilitarTexto(boolean editable) {
campoTexto.setEditable(editable);
}
/**
* @param args the command line arguments
*/
//<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
/*
* If Nimbus (introduced in Java SE 6) is not available, stay with the
* default look and feel. For details see
* http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
*/
try {
if ("Windows".equals(info.getName())) {
javax.
swing.
UIManager.
setLookAndFeel(info.
getClassName()); break;
}
}
java.util.logging.Logger.getLogger(PrincipalChat.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
java.util.logging.Logger.getLogger(PrincipalChat.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
java.util.logging.Logger.getLogger(PrincipalChat.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
java.util.logging.Logger.getLogger(PrincipalChat.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
//</editor-fold>
final PrincipalChat main = new PrincipalChat(); //Instanciacion de la clase Principalchat
main.setLocationRelativeTo(null); //Centrar el JFrame
main.
setDefaultCloseOperation(JFrame.
DO_NOTHING_ON_CLOSE); //habilita cerrar la ventana
@Override
public void windowClosing
(java.
awt.
event.
WindowEvent evt
) { if (JOptionPane.
showConfirmDialog(null,
"¿Desea realmente salir del sistema?",
main.mostrarMensaje("El servidor a Salido");
}
});
ExecutorService executor = Executors.newCachedThreadPool(); //Para correr los threads
try {
//main.mostrarMensaje("No se encuentra Servidor");
main.mostrarMensaje("Esperando Cliente ...");
//Bucle infinito para esperar conexiones de los clientes
while (true){
try {
conexion = servidor.accept(); //Permite al servidor aceptar conexiones
//main.mostrarMensaje("Conexion Establecida");
main.mostrarMensaje("Conectado a : " + conexion.getInetAddress().getHostName());
main.habilitarTexto(true); //permite escribir texto para enviar
//Ejecucion de los threads
executor.execute(new ThreadRecibe_s(conexion, main)); //client
executor.execute(new ThreadEnvia_s(conexion, main));
break;
Logger.getLogger(PrincipalChat.class.getName()).log(Level.SEVERE, null, ex);
}
}
Logger.getLogger(PrincipalChat.class.getName()).log(Level.SEVERE, null, ex);
} //Fin del catch
finally {
}
executor.shutdown();
}
}
como ves usa dos hilos
el ThreadEnvia_S es este y tiene implementado el Runnable:
Código Java:
Ver originalpublic ThreadEnvia_s
(Socket conexion,
final PrincipalChat main
){ this.conexion = conexion;
this.main = main;
//Evento que ocurre al escribir en el areaTexto
mensaje = event.getActionCommand();
enviarDatos(mensaje); //se envia el mensaje
main.campoTexto.setText(""); //borra el texto del enterfield
} //Fin metodo actionPerformed
}
);//Fin llamada a addActionListener
}
//enviar objeto a cliente
public void enviarDatos
(String mensaje
){ try {
salida.writeObject("Servidor>>> " + mensaje);
salida.flush(); //flush salida a cliente
main.mostrarMensaje("Servidor>>> " + mensaje);
} //Fin try
main.mostrarMensaje("Error escribiendo Mensaje");
} //Fin catch
} //Fin methodo enviarDatos
//manipula areaPantalla en el hilo despachador de eventos
public void mostrarMensaje
(String mensaje
) { main.areaTexto.append(mensaje);
}
public void run() {
try {
salida.flush();
ioException.printStackTrace();
}
}
Si necesitas ver el cliente como esta construido Avisame!, pues se me hace que es mucho codigo como para que lo muestre aqui y disculpa las molestias
Debo decir he intentado agregar el Synchonaized a la clas epor que encontre otro chat que los identifica por nombre siempre y cuando lleve un @antes pero no pude hacerlo espero me ayudes a s