Programación General > Java

 Problema con mini chat !!!!!

(1/1)

tuxwars:
Hola compañeros programadores, fijense que tengo un problema con un programa que me dejaron, es un mini chat usando socket este es una sola interfaz donde puedes ser cliente o servidor y de ahi se mandan mensajes, el problema es que al momento de darle al boton conectar del mini chat, este se atora, ya sea creando un servidor o un cliente.

Me base en el minichat que esta en el blog de casidiablo, lo curioso es que si uso su interfaz y me conecto con el mio, este se traba pero al cerrar aquel se destraba y salen todos los mensajes.

Es algo desesperante porque ya intente buscar cual es el problema pero no lo encuentro

Les dejo mi codigo y es de casi diablo espero me ayuden!!!!
El mio y recuerden poner en el no_puerto 12345:

--- Código: Java --- /** * @(#)mini_chat.java * * * @author tuxwars * @version 1.00 2011/3/24 */import javax.swing.*;//no olvidemos importar las libreriasimport java.awt.event.*;import java.awt.*;import javax.swing.event.*;import java.net.*;  //Biblioteca para utilizar ServidorSocketimport java.io.*; public class mini_chat extends JFrame implements ChangeListener {            /**     * Creates a new instance of <code>mini_chat</code>.     */    private JLabel Nom_ip,Num;    private JTextField n_ip,num_pu,mensaje;    private JRadioButton Cliente,Servidor;    private ButtonGroup grupo;    private JButton boton1,boton2;    private int contador = 1;    private ObjectOutputStream salida;    private ObjectInputStream entrada;    private ServerSocket servidor;    private Socket conexion;    private JTextArea area;    private int temp=1;    private int ban=0;    private String servidorChat;    private Socket cliente;    private static int ClientePuerto;    private  static int ServidorPuerto;            public mini_chat() {    //hacemos el frame donde colocaremos el textarea        setSize(500,300);        setTitle("Mini Chat MSN V. 1.3 Alpha");        setLocation(100,100);        setVisible(true);        setLayout(null);        setDefaultCloseOperation(3);        //------------------------------------------------------                   area = new JTextArea();        add(area);        area.setBounds(250,30,220,200);                /*---------------------------------------------------------*        |   hacemos un JScrollPane para poner el textarea en        |        |   el y asi si el texto es muy grande podremos mover el    |        |   el area visible y asi poder leer todo el texto          |        *---------------------------------------------------------*/                JScrollPane ajustar = new JScrollPane(area);        add(ajustar);        ajustar.setBounds(250,30,220,200);                Nom_ip = new JLabel("Nombre o IP: ");//hacemos el label        add(Nom_ip);//lo agregamos el frame        Nom_ip.setBounds(10,10,100,25);//colocamos las coordenadas                //(pos X, pos Y, ancho, alto)                n_ip = new JTextField(30);        add(n_ip);        n_ip.setBounds(90,10,150,30);                Nom_ip.setVisible(false);        n_ip.setVisible(false);                Num = new JLabel("No de puerto: ");//hacemos el label        add(Num);//lo agregamos el frame        Num.setBounds(10,40,130,40);//colocamos las coordenadas        //(pos X, pos Y, ancho, alto)                  num_pu = new JTextField(30);        add(num_pu);        num_pu.setBounds(90,50,150,30);                       Servidor=new JRadioButton("Servidor",true);        Cliente=new JRadioButton("Cliente",false);        grupo=new ButtonGroup();        add(Servidor);        Servidor.setBounds(10,110,100,40);        Servidor.addChangeListener(this);             add(Cliente);        Cliente.setBounds(120,110,100,40);        Cliente.addChangeListener(this);         grupo.add( Servidor );        grupo.add( Cliente );                boton1 = new JButton("Conectar");//hacemos el boton        add(boton1);//lo agremos al frame        boton1.setBounds(10,200,100,40);//colocamos las coordenadas        //(pos X, pos Y, ancho, alto)                boton2 = new JButton("Desconectar");//hacemos el boton        add(boton2);//lo agremos al frame        boton2.setBounds(130,200,110,40);//colocamos las coordenadas        //(pos X, pos Y, ancho, alto)                mensaje = new JTextField(80);        mensaje.setEditable(false);        add(mensaje);        mensaje.setBounds(250,230,220,25);        mensaje.addActionListener(         new ActionListener() {             // enviar mensaje al servidor            public void actionPerformed( ActionEvent evento )            {               enviarDatos( evento.getActionCommand() );               mensaje.setText( "" );            }         }        );                         boton2.addActionListener(new ActionListener(){        public void actionPerformed(ActionEvent e){            //aqui pones el codigo que quieras que se ejecute            //al dar click al boton            //ClienteSocket.close();            if(ban==1){                cerrarConexion();   // Paso 5: cerrar la conexión.            }else{                mostrarMensaje( "Cree una conexion antesn" );              }            ban=0;        }});         }                public void stateChanged(ChangeEvent e) {            if (Cliente.isSelected()) {                Nom_ip.setVisible(true);                n_ip.setVisible(true);                boton1.addActionListener(new ActionListener(){                public void actionPerformed(ActionEvent e){                    SwingUtilities.invokeLater(                        new Runnable() {  // clase interna para asegurar que la GUI se actualice apropiadamente                             public void run() // actualiza areaPantalla                            {                                 //aqui pones el codigo que quieras que se ejecute                                //al dar click al boton                                //System.out.println("Hola");                                ban=1;                                 ejecutarCliente();                            }                        }                    );                  }            });                                 temp=0;            }            if (Servidor.isSelected()) {                Nom_ip.setVisible(false);                n_ip.setVisible(false);                boton1.addActionListener(new ActionListener(){                public void actionPerformed(ActionEvent e){                    SwingUtilities.invokeLater(                        new Runnable() {  // clase interna para asegurar que la GUI se actualice apropiadamente                             public void run() // actualiza areaPantalla                            {                                 //aqui pones el codigo que quieras que se ejecute                                //al dar click al boton                                //System.out.println("Hola");                                ban=1;                                 ejecutarServidor();                             }                        }                    );                  }            });                temp=1;            }               }             // configurar y ejecutar el servidor    public void ejecutarServidor()   {      // configurar servidor para que reciba conexiones; procesar las conexiones      try {          // Paso 1: crear un objeto ServerSocket.                 ServidorPuerto=Integer.parseInt(num_pu.getText());         servidor = new ServerSocket( ServidorPuerto );          for(;;) {             try {               esperarConexion(); // Paso 2: esperar una conexión.               obtenerFlujos();        // Paso 3: obtener flujos de entrada y salida.               procesarConexion(); // Paso 4: procesar la conexión.            }             // procesar excepción EOFException cuando el cliente cierre la conexión             catch ( EOFException excepcionEOF ) {               System.err.println( "El servidor terminó la conexión" );            }          } // fin de instrucción while       } // fin del bloque try       // procesar problemas con E/S      catch ( IOException excepcionES ) {         excepcionES.printStackTrace();      }    } // fin del método ejecutarServidor   // conectarse al servidor y procesar mensajes del servidor   private void ejecutarCliente()    {      // conectarse al servidor, obtener flujos, procesar la conexión      try {         conectarAServidor(); // Paso 1: crear un socket para realizar la conexión         obtenerFlujos();      // Paso 2: obtener los flujos de entrada y salida         procesarConexion(); // Paso 3: procesar la conexión      }       // el servidor cerró la conexión      catch ( EOFException excepcionEOF ) {         System.err.println( "El cliente termino la conexión" );      }       // procesar los problemas que pueden ocurrir al comunicarse con el servidor      catch ( IOException excepcionES ) {         excepcionES.printStackTrace();      }     } // fin del método ejecutarCliente    // conectarse al servidor   private void conectarAServidor() throws IOException   {            mostrarMensaje( "Intentando realizar conexiónn" );      servidorChat = n_ip.getText(); // establecer el servidor al que se va a conectar este cliente      // crear Socket para realizar la conexión con el servidor      ClientePuerto=Integer.parseInt(num_pu.getText());      cliente = new Socket( InetAddress.getByName( servidorChat ), ClientePuerto );       // mostrar la información de la conexión      mostrarMensaje( "Conectado a: " +          cliente.getInetAddress().getHostName() );   }    // esperar que la conexión llegue, después mostrar información de la conexión   private void esperarConexion() throws IOException   {      mostrarMensaje( "Esperando una conexiónn" );      conexion = servidor.accept(); // permitir al servidor aceptar la conexión                  mostrarMensaje( "Conexión " + contador + " recibida de: " +         conexion.getInetAddress().getHostName() );   }    // obtener flujos para enviar y recibir datos   private void obtenerFlujos() throws IOException   {      if(temp==1){        // establecer flujo de salida para los objetos        salida = new ObjectOutputStream( conexion.getOutputStream() );        salida.flush(); // vaciar búfer de salida para enviar información de encabezado         // establecer flujo de entrada para los objetos        entrada = new ObjectInputStream( conexion.getInputStream() );         mostrarMensaje( "nSe recibieron los flujos de E/Sn" );      }if(temp==0){         // establecer flujo de salida para los objetos        salida = new ObjectOutputStream( cliente.getOutputStream() );              salida.flush(); // vacíar búfer de salida para enviar información de encabezado         // establecer flujo de entrada para los objetos        entrada = new ObjectInputStream( cliente.getInputStream() );         mostrarMensaje( "nSe recibieron los flujos de E/Sn" );              }   }   // procesar la conexión con el cliente   private void procesarConexion() throws IOException   {      if(temp==1){        // enviar mensaje de conexión exitosa al cliente        String mensaje = "Conexión exitosa";        enviarDatos( mensaje );         // habilitar campoIntroducir para que el usuario del servidor pueda enviar mensajes        establecerCampoTextoEditable( true );         do { // procesar los mensajes enviados por el cliente             // leer el mensaje y mostrarlo en pantalla            try {                mensaje = ( String ) entrada.readObject();                mostrarMensaje( "n" + mensaje );            }             // atrapar problemas que pueden ocurrir al tratar de leer del cliente            catch ( ClassNotFoundException excepcionClaseNoEncontrada ) {                mostrarMensaje( "nSe recibió un tipo de objeto desconocido" );            }         } while ( !mensaje.equals( "CLIENTE>>> TERMINAR" ) );      }if(temp==0){        // habilitar campoIntroducir para que el usuario del cliente pueda enviar mensajes        String mensaje = "Conexión exitosa";        enviarDatos( mensaje );                 establecerCampoTextoEditable( true );         do { // procesar mensajes enviados del servidor             // leer mensaje y mostrarlo en pantalla            try {                mensaje = ( String ) entrada.readObject();                mostrarMensaje( "n" + mensaje );            }             // atrapar los problemas que pueden ocurrir al leer del servidor            catch ( ClassNotFoundException excepcionClaseNoEncontrada ) {                mostrarMensaje( "nSe recibió un objeto de tipo desconocido" );            }         } while ( !mensaje.equals( "SERVIDOR>>> TERMINAR" ) );        }    } // fin del método procesarConexion    // cerrar flujos y socket   private void cerrarConexion()    {      mostrarMensaje( "nFinalizando la conexiónn" );      establecerCampoTextoEditable( false ); // deshabilitar campoIntroducir       try {         salida.close();         entrada.close();         conexion.close();         cliente.close();      }      catch( IOException excepcionES ) {         excepcionES.printStackTrace();      }   }    // enviar mensaje al cliente   private void enviarDatos( String mensaje )   {      // enviar objeto al cliente      try {        if(temp==1){         salida.writeObject( "SERVIDOR>>> " + mensaje );         salida.flush();         mostrarMensaje( "nSERVIDOR>>> " + mensaje );        }else if(temp==0){         salida.writeObject( "CLIENTE>>> " + mensaje );         salida.flush();         mostrarMensaje( "nCLIENTE>>> " + mensaje );        }      }       // procesar problemas que pueden ocurrir al enviar el objeto      catch ( IOException excepcionES ) {         area.append( "nError al escribir objeto" );      }   }    // método utilitario que es llamado desde otros subprocesos para manipular a   // areaPantalla en el subproceso despachador de eventos   private void mostrarMensaje( final String mensajeAMostrar )   {      // mostrar mensaje del subproceso de ejecución despachador de eventos      SwingUtilities.invokeLater(         new Runnable() {  // clase interna para asegurar que la GUI se actualice apropiadamente             public void run() // actualiza areaPantalla            {               area.append( mensajeAMostrar );               area.setCaretPosition(                   area.getText().length() );            }          }  // fin de la clase interna       ); // fin de la llamada a SwingUtilities.invokeLater   }    // método utilitario que es llamado desde otros subprocesos para manipular a    // campoIntroducir en el subproceso despachador de eventos   private void establecerCampoTextoEditable( final boolean editable )   {      // mostrar mensaje del subproceso de ejecución despachador de eventos      SwingUtilities.invokeLater(         new Runnable() {  // clase interna para asegurar que la GUI se actualice apropiadamente             public void run()  // establece la capacidad de modificar a campoIntroducir            {               mensaje.setEditable( editable );            }          }  // fin de la clase interna       ); // fin de la llamada a SwingUtilities.invokeLater   }              /**     * @param args the command line arguments     */    public static void main(String[] args) {        // TODO code application logic here        mini_chat mn = new mini_chat();    }}  
El de casi Diablo Cliente

--- Código: Java --- // Cliente que lee y muestra la información que le envía un Servidor.import java.io.*;import java.net.*;import java.awt.*;import java.awt.event.*;import javax.swing.*; public class Cliente extends JFrame {   private JTextField campoIntroducir;   private JTextArea areaPantalla;   private ObjectOutputStream salida;   private ObjectInputStream entrada;   private String mensaje = "";   private String servidorChat;   private Socket cliente;    // inicializar servidorChat y configurar GUI   public Cliente( String host )   {      super( "Cliente" );       servidorChat = host; // establecer el servidor al que se va a conectar este cliente       Container contenedor = getContentPane();       // crear campoIntroducir y registrar componente de escucha      campoIntroducir = new JTextField();      campoIntroducir.setEditable( false );      campoIntroducir.addActionListener(         new ActionListener() {             // enviar mensaje al servidor            public void actionPerformed( ActionEvent evento )            {               enviarDatos( evento.getActionCommand() );               campoIntroducir.setText( "" );            }         }        );        contenedor.add( campoIntroducir, BorderLayout.NORTH );       // crear areaPantalla      areaPantalla = new JTextArea();      contenedor.add( new JScrollPane( areaPantalla ),         BorderLayout.CENTER );       setSize( 300, 150 );      setVisible( true );    } // fin del constructor de Cliente    // conectarse al servidor y procesar mensajes del servidor   private void ejecutarCliente()    {      // conectarse al servidor, obtener flujos, procesar la conexión      try {         conectarAServidor(); // Paso 1: crear un socket para realizar la conexión         obtenerFlujos();      // Paso 2: obtener los flujos de entrada y salida         procesarConexion(); // Paso 3: procesar la conexión      }       // el servidor cerró la conexión      catch ( EOFException excepcionEOF ) {         System.err.println( "El cliente termino la conexión" );      }       // procesar los problemas que pueden ocurrir al comunicarse con el servidor      catch ( IOException excepcionES ) {         excepcionES.printStackTrace();      }       finally {         cerrarConexion(); // Paso 4: cerrar la conexión      }    } // fin del método ejecutarCliente    // conectarse al servidor   private void conectarAServidor() throws IOException   {            mostrarMensaje( "Intentando realizar conexiónn" );       // crear Socket para realizar la conexión con el servidor      cliente = new Socket( InetAddress.getByName( servidorChat ), 12345 );       // mostrar la información de la conexión      mostrarMensaje( "Conectado a: " +          cliente.getInetAddress().getHostName() );   }    // obtener flujos para enviar y recibir datos   private void obtenerFlujos() throws IOException   {      // establecer flujo de salida para los objetos      salida = new ObjectOutputStream( cliente.getOutputStream() );            salida.flush(); // vacíar búfer de salida para enviar información de encabezado       // establecer flujo de entrada para los objetos      entrada = new ObjectInputStream( cliente.getInputStream() );       mostrarMensaje( "nSe recibieron los flujos de E/Sn" );   }    // procesar la conexión con el servidor   private void procesarConexion() throws IOException   {      // habilitar campoIntroducir para que el usuario del cliente pueda enviar mensajes      establecerCampoTextoEditable( true );       do { // procesar mensajes enviados del servidor          // leer mensaje y mostrarlo en pantalla         try {            mensaje = ( String ) entrada.readObject();            mostrarMensaje( "n" + mensaje );         }          // atrapar los problemas que pueden ocurrir al leer del servidor         catch ( ClassNotFoundException excepcionClaseNoEncontrada ) {            mostrarMensaje( "nSe recibió un objeto de tipo desconocido" );         }       } while ( !mensaje.equals( "SERVIDOR>>> TERMINAR" ) );    } // fin del método procesarConexion    // cerrar flujos y socket   private void cerrarConexion()    {      mostrarMensaje( "nCerrando conexión" );      establecerCampoTextoEditable( false ); // deshabilitar campoIntroducir       try {         salida.close();         entrada.close();         cliente.close();      }      catch( IOException excepcionES ) {         excepcionES.printStackTrace();      }   }    // enviar mensaje al servidor   private void enviarDatos( String mensaje )   {      // enviar objeto al servidor      try {         salida.writeObject( "CLIENTE>>> " + mensaje );         salida.flush();         mostrarMensaje( "nCLIENTE>>> " + mensaje );      }       // procesar los problemas que pueden ocurrir al enviar el objeto      catch ( IOException excepcionES ) {         areaPantalla.append( "nError al escribir el objeto" );      }   }    // método utilitario que es llamado desde otros subprocesos para manipular a    // areaPantalla en el subproceso despachador de eventos   private void mostrarMensaje( final String mensajeAMostrar )   {      // mostrar mensaje del subproceso de ejecución de la GUI      SwingUtilities.invokeLater(         new Runnable() {  // clase interna para asegurar que la GUI se actualice apropiadamente             public void run() // actualiza areaPantalla            {               areaPantalla.append( mensajeAMostrar );               areaPantalla.setCaretPosition(                   areaPantalla.getText().length() );            }          }  // fin de la clase interna       ); // fin de la llamada a SwingUtilities.invokeLater   }    // método utilitario que es llamado desde otros subprocesos para manipular a    // campoIntroducir en el subproceso despachador de eventos   private void establecerCampoTextoEditable( final boolean editable )   {      // mostrar mensaje del subproceso de ejecución de la GUI      SwingUtilities.invokeLater(         new Runnable() {  // clase interna para asegurar que la GUI se actualice apropiadamente             public void run()  // establece la capacidad de modificar campoIntroducir            {               campoIntroducir.setEditable( editable );            }          }  // fin de la clase interna       ); // fin de la llamada a SwingUtilities.invokeLater   }    public static void main( String args[] )   {      Cliente aplicacion;       if ( args.length == 0 )         aplicacion = new Cliente( "127.0.0.1" );      else         aplicacion = new Cliente( args[ 0 ] );       aplicacion.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );      aplicacion.ejecutarCliente();   } } // fin de la clase Cliente 
Gracias Anticipadas!!!!!!!! :good:

Navegación

[0] Índice de Mensajes

Ir a la versión completa