Ver Mensaje Individual
  #5 (permalink)  
Antiguo 05/02/2018, 03:01
sgrajaleshdz
 
Fecha de Ingreso: marzo-2016
Ubicación: World Wide Web
Mensajes: 30
Antigüedad: 8 años
Puntos: 3
Respuesta: Como cerrar una Jframe desde un DataInputStrem

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 original
  1. public class PrincipalChat extends JFrame{
  2.     public JTextField campoTexto; //Para mostrar mensajes de los usuarios
  3.     public JTextArea areaTexto; //Para ingresar mensaje a enviar
  4.     private static ServerSocket servidor; //
  5.     private static Socket conexion; //Socket para conectarse con el cliente
  6.     InetAddress address;
  7.     private static String ip; //ip a la cual se conecta
  8.     private static final int maxClientsCount = 10;
  9.     private static final ThreadEnvia[] threads = new ThreadEnvia[maxClientsCount];
  10.     public static PrincipalChat main;
  11.    
  12.     public PrincipalChat() throws UnknownHostException{
  13.         super("Mi Control Cyber - Servidor"); //Establece titulo al Frame
  14.         address = InetAddress.getLocalHost();
  15.         ip=address.getHostAddress();
  16.        
  17.         campoTexto = new JTextField(); //crea el campo para texto
  18.         campoTexto.setEditable(false); //No permite que sea editable el campo de texto
  19.         add(campoTexto, BorderLayout.NORTH); //Coloca el campo de texto en la parte superior
  20.        
  21.         areaTexto = new JTextArea(); //Crear displayArea
  22.         areaTexto.setEditable(false);
  23.         add(new JScrollPane(areaTexto), BorderLayout.CENTER);
  24.         areaTexto.setBackground(Color.orange); //Pone de color cyan al areaTexto
  25.         areaTexto.setForeground(Color.BLACK); //pinta azul la letra en el areaTexto
  26.         campoTexto.setForeground(Color.BLACK); //pinta toja la letra del mensaje a enviar
  27.        
  28.        
  29.         //Crea menu Archivo y submenu Salir, ademas agrega el submenu al menu
  30.         JMenu menuArchivo = new JMenu("Archivo");
  31.         JMenuItem salir = new JMenuItem("Salir");
  32.         menuArchivo.add(salir); //Agrega el submenu Salir al menu menuArchivo
  33.        
  34.         JMenuBar barra = new JMenuBar(); //Crea la barra de menus
  35.         setJMenuBar(barra); //Agrega barra de menus a la aplicacion
  36.         barra.add(menuArchivo); //agrega menuArchivo a la barra de menus
  37.        
  38.         //Accion que se realiza cuando se presiona el submenu Salir
  39.         salir.addActionListener(new ActionListener() { //clase interna anonima
  40.                 public void actionPerformed(ActionEvent e) {
  41.                     System.exit(0); //Sale de la aplicacion
  42.                 }
  43.         });
  44.        
  45.         setSize(400, 400); //Establecer tamano a ventana
  46.         setVisible(true); //Pone visible la ventana
  47.         setResizable(false);//no permite redimencionar
  48.     }
  49.    
  50.     //Para mostrar texto en displayArea
  51.     public void mostrarMensaje(String mensaje) {
  52.         areaTexto.append(mensaje + "\n");
  53.     }
  54.     public void habilitarTexto(boolean editable) {
  55.         campoTexto.setEditable(editable);
  56.     }
  57.  
  58.  
  59.              
  60.    
  61.     /**
  62.      * @param args the command line arguments
  63.      */
  64.     public static void main(String[] args) throws UnknownHostException {
  65.        
  66.         //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
  67.         /*
  68.          * If Nimbus (introduced in Java SE 6) is not available, stay with the
  69.          * default look and feel. For details see
  70.          * http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
  71.          */
  72.         try {
  73.             for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
  74.                 if ("Windows".equals(info.getName())) {
  75.                     javax.swing.UIManager.setLookAndFeel(info.getClassName());
  76.                     break;
  77.                 }
  78.             }
  79.         } catch (ClassNotFoundException ex) {
  80.             java.util.logging.Logger.getLogger(PrincipalChat.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
  81.         } catch (InstantiationException ex) {
  82.             java.util.logging.Logger.getLogger(PrincipalChat.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
  83.         } catch (IllegalAccessException ex) {
  84.             java.util.logging.Logger.getLogger(PrincipalChat.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
  85.         } catch (javax.swing.UnsupportedLookAndFeelException ex) {
  86.             java.util.logging.Logger.getLogger(PrincipalChat.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
  87.         }
  88.        
  89.         //</editor-fold>
  90.        
  91.         final PrincipalChat main = new PrincipalChat(); //Instanciacion de la clase Principalchat
  92.         main.setLocationRelativeTo(null);   //Centrar el JFrame
  93.         main.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); //habilita cerrar la ventana
  94.                
  95.         main.addWindowListener(new java.awt.event.WindowAdapter() {
  96.             @Override
  97.             public void windowClosing(java.awt.event.WindowEvent evt) {
  98.                 if (JOptionPane.showConfirmDialog(null, "¿Desea realmente salir del sistema?",
  99.                 "Salir del sistema", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION)
  100.                     main.mostrarMensaje("El servidor a Salido");
  101.             System.exit(0);
  102.             }
  103.         });
  104.        
  105.         ExecutorService executor = Executors.newCachedThreadPool(); //Para correr los threads
  106.  
  107.         try {
  108.             //main.mostrarMensaje("No se encuentra Servidor");
  109.             servidor = new ServerSocket(11111, 100);
  110.             main.mostrarMensaje("Esperando Cliente ...");
  111.  
  112.             //Bucle infinito para esperar conexiones de los clientes
  113.             while (true){
  114.                 try {
  115.                     conexion = servidor.accept(); //Permite al servidor aceptar conexiones        
  116.                    
  117.                        
  118.                     //main.mostrarMensaje("Conexion Establecida");
  119.                     main.mostrarMensaje("Conectado a : " + conexion.getInetAddress().getHostName());
  120.  
  121.                     main.habilitarTexto(true); //permite escribir texto para enviar
  122.  
  123.                     //Ejecucion de los threads
  124.                     executor.execute(new ThreadRecibe_s(conexion, main)); //client
  125.                     executor.execute(new ThreadEnvia_s(conexion, main));
  126.                     break;
  127.                        
  128.                 } catch (IOException ex) {
  129.                     Logger.getLogger(PrincipalChat.class.getName()).log(Level.SEVERE, null, ex);
  130.                 }  
  131.             }
  132.    
  133.         } catch (IOException ex) {
  134.             Logger.getLogger(PrincipalChat.class.getName()).log(Level.SEVERE, null, ex);
  135.         } //Fin del catch
  136.         finally {
  137.         }
  138.         executor.shutdown();
  139.     }
  140. }

como ves usa dos hilos

el ThreadEnvia_S es este y tiene implementado el Runnable:

Código Java:
Ver original
  1. public ThreadEnvia_s(Socket conexion, final PrincipalChat main){
  2.         this.conexion = conexion;
  3.         this.main = main;
  4.        
  5.         //Evento que ocurre al escribir en el areaTexto
  6.         main.campoTexto.addActionListener(new ActionListener() {
  7.             public void actionPerformed(ActionEvent event) {
  8.                 mensaje = event.getActionCommand();
  9.                 enviarDatos(mensaje); //se envia el mensaje
  10.                 main.campoTexto.setText(""); //borra el texto del enterfield
  11.             } //Fin metodo actionPerformed
  12.         }
  13.         );//Fin llamada a addActionListener        
  14.     }
  15.  
  16.    //enviar objeto a cliente
  17.    public void enviarDatos(String mensaje){
  18.       try {
  19.          salida.writeObject("Servidor>>> " + mensaje);
  20.          salida.flush(); //flush salida a cliente
  21.          main.mostrarMensaje("Servidor>>> " + mensaje);
  22.       } //Fin try
  23.       catch (IOException ioException){
  24.          main.mostrarMensaje("Error escribiendo Mensaje");
  25.       } //Fin catch  
  26.      
  27.    } //Fin methodo enviarDatos
  28.  
  29.    //manipula areaPantalla en el hilo despachador de eventos
  30.     public void mostrarMensaje(String mensaje) {
  31.         main.areaTexto.append(mensaje);
  32.     }
  33.    
  34.     public void run() {
  35.          try {
  36.             salida = new ObjectOutputStream(conexion.getOutputStream());
  37.             salida.flush();
  38.         } catch (SocketException ex) {
  39.         } catch (IOException ioException) {
  40.           ioException.printStackTrace();
  41.         } catch (NullPointerException ex) {
  42.         }
  43.     }


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
__________________
Desbloquea esos limites...