Tema: Chat en java
Ver Mensaje Individual
  #3 (permalink)  
Antiguo 07/05/2011, 21:54
endgel
 
Fecha de Ingreso: diciembre-2010
Mensajes: 26
Antigüedad: 14 años
Puntos: 2
Respuesta: Chat en java

Código Javascript:
Ver original
  1. package chat;
  2.  
  3. // Configurar un servidor que reciba una conexión de un cliente, envíe
  4. // una cadena al cliente y cierre la conexión.
  5. import java.io.*;
  6. import java.net.*;
  7. import java.awt.*;
  8. import java.awt.event.*;
  9. import javax.swing.*;
  10.  
  11. public class Servidor extends JFrame {
  12.    private JTextField campoIntroducir;
  13.    private JTextArea areaPantalla;
  14.    private ObjectOutputStream salida;
  15.    private ObjectInputStream entrada;
  16.    private ServerSocket servidor;
  17.    private Socket conexion;
  18.    private int contador = 1;
  19.  
  20.    // configurar GUI
  21.    public Servidor()
  22.    {
  23.       super( "Servidor" );
  24.  
  25.       Container contenedor = getContentPane();
  26.  
  27.       // crear campoIntroducir y registrar componente de escucha
  28.       campoIntroducir = new JTextField();
  29.       campoIntroducir.setEditable( false );
  30.       campoIntroducir.addActionListener(
  31.          new ActionListener() {
  32.  
  33.             // enviar mensaje al cliente
  34.             public void actionPerformed( ActionEvent evento )
  35.             {
  36.                enviarDatos( evento.getActionCommand() );
  37.                campoIntroducir.setText( "" );
  38.             }
  39.          }  
  40.       );
  41.  
  42.       contenedor.add( campoIntroducir, BorderLayout.NORTH );
  43.  
  44.       // crear areaPantalla
  45.       areaPantalla = new JTextArea();
  46.       contenedor.add( new JScrollPane( areaPantalla ),
  47.          BorderLayout.CENTER );
  48.  
  49.       setSize( 300, 150 );
  50.       setVisible( true );
  51.  
  52.    } // fin del constructor de Servidor
  53.  
  54.    // configurar y ejecutar el servidor
  55.    public void ejecutarServidor()
  56.    {
  57.       // configurar servidor para que reciba conexiones; procesar las conexiones
  58.       try {
  59.  
  60.          // Paso 1: crear un objeto ServerSocket.
  61.          servidor = new ServerSocket( 12345, 100 );
  62.  
  63.          while ( true ) {
  64.  
  65.             try {
  66.                esperarConexion(); // Paso 2: esperar una conexión.
  67.                obtenerFlujos();        // Paso 3: obtener flujos de entrada y salida.
  68.                procesarConexion(); // Paso 4: procesar la conexión.
  69.             }
  70.  
  71.             // procesar excepción EOFException cuando el cliente cierre la conexión
  72.             catch ( EOFException excepcionEOF ) {
  73.                System.err.println( "El servidor terminó la conexión" );
  74.             }
  75.  
  76.             finally {
  77.                cerrarConexion();   // Paso 5: cerrar la conexión.
  78.                ++contador;
  79.             }
  80.  
  81.          } // fin de instrucción while
  82.  
  83.       } // fin del bloque try
  84.  
  85.       // procesar problemas con E/S
  86.       catch ( IOException excepcionES ) {
  87.          excepcionES.printStackTrace();
  88.       }
  89.  
  90.    } // fin del método ejecutarServidor
  91.  
  92.    // esperar que la conexión llegue, después mostrar información de la conexión
  93.    private void esperarConexion() throws IOException
  94.    {
  95.       mostrarMensaje( "Esperando una conexión\n" );
  96.       conexion = servidor.accept(); // permitir al servidor aceptar la conexión            
  97.       mostrarMensaje( "Conexión " + contador + " recibida de: " +
  98.          conexion.getInetAddress().getHostName() );
  99.    }
  100.  
  101.    // obtener flujos para enviar y recibir datos
  102.    private void obtenerFlujos() throws IOException
  103.    {
  104.       // establecer flujo de salida para los objetos
  105.       salida = new ObjectOutputStream( conexion.getOutputStream() );
  106.       salida.flush(); // vaciar búfer de salida para enviar información de encabezado
  107.  
  108.       // establecer flujo de entrada para los objetos
  109.       entrada = new ObjectInputStream( conexion.getInputStream() );
  110.  
  111.       mostrarMensaje( "\nSe recibieron los flujos de E/S\n" );
  112.    }
  113.  
  114.    // procesar la conexión con el cliente
  115.    private void procesarConexion() throws IOException
  116.    {
  117.       // enviar mensaje de conexión exitosa al cliente
  118.       String mensaje = "Conexión exitosa";
  119.       enviarDatos( mensaje );
  120.  
  121.       // habilitar campoIntroducir para que el usuario del servidor pueda enviar mensajes
  122.       establecerCampoTextoEditable( true );
  123.  
  124.       do { // procesar los mensajes enviados por el cliente
  125.  
  126.          // leer el mensaje y mostrarlo en pantalla
  127.          try {
  128.             mensaje = ( String ) entrada.readObject();
  129.             mostrarMensaje( "\n" + mensaje );
  130.          }
  131.  
  132.          // atrapar problemas que pueden ocurrir al tratar de leer del cliente
  133.          catch ( ClassNotFoundException excepcionClaseNoEncontrada ) {
  134.             mostrarMensaje( "\nSe recibió un tipo de objeto desconocido" );
  135.          }
  136.  
  137.       } while ( !mensaje.equals( "CLIENTE>>> TERMINAR" ) );
  138.  
  139.    } // fin del método procesarConexion
  140.  
  141.    // cerrar flujos y socket
  142.    private void cerrarConexion()
  143.    {
  144.       mostrarMensaje( "\nFinalizando la conexión\n" );
  145.       establecerCampoTextoEditable( false ); // deshabilitar campoIntroducir
  146.  
  147.       try {
  148.          salida.close();
  149.          entrada.close();
  150.          conexion.close();
  151.       }
  152.       catch( IOException excepcionES ) {
  153.          excepcionES.printStackTrace();
  154.       }
  155.    }
  156.  
  157.    // enviar mensaje al cliente
  158.    private void enviarDatos( String mensaje )
  159.    {
  160.       // enviar objeto al cliente
  161.       try {
  162.          salida.writeObject( "SERVIDOR>>> " + mensaje );
  163.          salida.flush();
  164.          mostrarMensaje( "\nSERVIDOR>>> " + mensaje );
  165.       }
  166.  
  167.       // procesar problemas que pueden ocurrir al enviar el objeto
  168.       catch ( IOException excepcionES ) {
  169.          areaPantalla.append( "\nError al escribir objeto" );
  170.       }
  171.    }
  172.  
  173.    // método utilitario que es llamado desde otros subprocesos para manipular a
  174.    // areaPantalla en el subproceso despachador de eventos
  175.    private void mostrarMensaje( final String mensajeAMostrar )
  176.    {
  177.       // mostrar mensaje del subproceso de ejecución despachador de eventos
  178.       SwingUtilities.invokeLater(
  179.          new Runnable() {  // clase interna para asegurar que la GUI se actualice apropiadamente
  180.  
  181.             public void run() // actualiza areaPantalla
  182.             {
  183.                areaPantalla.append( mensajeAMostrar );
  184.                areaPantalla.setCaretPosition(
  185.                   areaPantalla.getText().length() );
  186.             }
  187.  
  188.          }  // fin de la clase interna
  189.  
  190.       ); // fin de la llamada a SwingUtilities.invokeLater
  191.    }
  192.  
  193.    // método utilitario que es llamado desde otros subprocesos para manipular a
  194.    // campoIntroducir en el subproceso despachador de eventos
  195.    private void establecerCampoTextoEditable( final boolean editable )
  196.    {
  197.       // mostrar mensaje del subproceso de ejecución despachador de eventos
  198.       SwingUtilities.invokeLater(
  199.          new Runnable() {  // clase interna para asegurar que la GUI se actualice apropiadamente
  200.  
  201.             public void run()  // establece la capacidad de modificar a campoIntroducir
  202.             {
  203.                campoIntroducir.setEditable( editable );
  204.             }
  205.  
  206.          }  // fin de la clase interna
  207.  
  208.       ); // fin de la llamada a SwingUtilities.invokeLater
  209.    }
  210.  
  211.    public static void main( String args[] )
  212.    {
  213.       Servidor aplicacion = new Servidor();
  214.       aplicacion.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
  215.       aplicacion.ejecutarServidor();
  216.    }
  217.  
  218. }  // fin de la clase Servidor