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
Ir a la versión completa