domingo, 19 de julio de 2009

CHAT UDP

UDP
¿Qué es UDP?
UDP son las siglas de Protocolo de Datagrama de Usuario es un protocolo no orientado a conexión de la capa de transporte del modeloTCP/IP.
En la familia de protocolos de Internet. UDP proporciona una sencilla interfaz entre la capa de red y la capa de aplicación. UDP no otorga garantías para la entrega de sus mensajes y el origen UDP no retiene estados de los mensajes UDP que han sido enviados a la red. UDP.
El encabezado del segmento UDP es:
Puerto de origen(16 bits);
Puerto de destino(16 bits);
Longitud total(16 bits);
Suma de comprobación del encabezado(16 bits);
Datos (longitud variable).
Puerto de origen: Es el número de puerto relacionado con la aplicación del remitente del segmento UDP. Este campo representa una dirección de respuesta para el destinatario. Por lo tanto, este campo es opcional. Esto significa que si el puerto de origen no está especificado, los 16 bits de este campo se pondrán en cero. En este caso, el destinatario no podrá responder (lo cual no es estrictamente necesario, en particular para mensajes unidireccionales).
Puerto de destino: Este campo contiene el puerto correspondiente a la aplicación del equipo receptor al que se envía.
Longitud: Este campo especifica la longitud total del segmento, con el encabezado incluido. Sin embargo, el encabezado tiene una longitud de 4 x 16 bits (que es 8 x 8 bits), por lo tanto la longitud del campo es necesariamente superior o igual a 8 bytes.
Suma de comprobación: Es una suma de comprobación realizada de manera tal que permita controlar la integridad del segmento.Codigo Servidor - ClienteServidor.java// Servidor que recibe y envía paquetes de/a un cliente.import java.io.*;import java.net.*;import java.awt.*;import java.awt.event.*;import javax.swing.*;public class Servidor extends JFrame {private JTextArea areaPantalla;private DatagramSocket socket;// configurar GUI y DatagramSocketpublic Servidor(){super( "Servidor" );areaPantalla = new JTextArea();getContentPane().add( new JScrollPane( areaPantalla ),BorderLayout.CENTER );setSize( 400, 300 );setVisible( true );// crear objeto DatagramSocket para enviar y recibir paquetestry {socket = new DatagramSocket( 5000 );}// procesar los problemas que pueden ocurrir al crear el objeto DatagramSocketcatch( SocketException excepcionSocket ) {excepcionSocket.printStackTrace();System.exit( 1 );}} // fin del constructor de Servidor// esperar a que lleguen los paquetes, mostrar los datos y repetir el paquete al clienteprivate void esperarPaquetes(){while ( true ) { // iterar infinitamente// recibir paquete, mostrar su contenido, devolver copia al clientetry {// establecer el paquetebyte datos[] = new byte[ 100 ];DatagramPacket recibirPaquete =new DatagramPacket( datos, datos.length );socket.receive( recibirPaquete ); // esperar el paquete// mostrar la información del paquete recibidomostrarMensaje( "\nPaquete recibido:" +"\nDel host: " + recibirPaquete.getAddress() +"\nPuerto del host: " + recibirPaquete.getPort() +"\nLongitud: " + recibirPaquete.getLength() +"\nContenido:\n\t" + new String( recibirPaquete.getData(),0, recibirPaquete.getLength() ) );enviarPaqueteACliente( recibirPaquete ); // enviar paquete al cliente}// procesar los problemas que pueden ocurrir al manipular el paquetecatch( IOException excepcionES ) {mostrarMensaje( excepcionES.toString() + "\n" );excepcionES.printStackTrace();}} // fin de instrucción while} // fin del método esperarPaquetes// repetir el paquete al clienteprivate void enviarPaqueteACliente( DatagramPacket recibirPaquete )throws IOException{mostrarMensaje( "\n\nRepitiendo datos al cliente..." );// crear paquete a enviarDatagramPacket enviarPaquete = new DatagramPacket(recibirPaquete.getData(), recibirPaquete.getLength(),recibirPaquete.getAddress(), recibirPaquete.getPort() );socket.send( enviarPaquete ); // enviar el paquetemostrarMensaje( "Paquete enviado\n" );}// método utilitario que es llamado desde otros subprocesos para manipular a// areaPantalla en el subproceso despachador de eventosprivate void mostrarMensaje( final String mensajeAMostrar ){// mostrar el mensaje del subproceso de ejecución despachador de eventosSwingUtilities.invokeLater(new Runnable() { // clase interna para asegurar que la GUI se actualice apropiadamentepublic void run() // actualiza areaPantalla{areaPantalla.append( mensajeAMostrar );areaPantalla.setCaretPosition(areaPantalla.getText().length() );}} // fin de la clase interna); // fin de la llamada a SwingUtilities.invokeLater}public static void main( String args[] ){JFrame.setDefaultLookAndFeelDecorated(true);Servidor aplicacion = new Servidor();aplicacion.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );aplicacion.esperarPaquetes();}} // fin de la clase Servidor*****************************************************************************Cliente.java// Cliente que envía y recibe paquetes a/de 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 DatagramSocket socket;// configurar GUI y DatagramSocketpublic Cliente(){super( "Cliente" );Container contenedor = getContentPane();campoIntroducir = new JTextField( "Escriba aquí el mensaje" );campoIntroducir.addActionListener(new ActionListener() {public void actionPerformed( ActionEvent evento ){// crear y enviar el paquetetry {areaPantalla.append( "\nEnviando paquete que contiene: " +evento.getActionCommand() + "\n" );// obtener mensaje del campo de texto y convertirlo en arreglo byteString mensaje = evento.getActionCommand();byte datos[] = mensaje.getBytes();// crear enviarPaqueteDatagramPacket enviarPaquete = new DatagramPacket( datos,datos.length, InetAddress.getLocalHost(), 5000 );socket.send( enviarPaquete ); // enviar paqueteareaPantalla.append( "Paquete enviado\n" );areaPantalla.setCaretPosition(areaPantalla.getText().length() );}// procesar los problemas que pueden ocurrir al crear o enviar el paquetecatch ( IOException excepcionES ) {mostrarMensaje( excepcionES.toString() + "\n" );excepcionES.printStackTrace();}} // fin de actionPerformed} // fin de la clase interna); // fin de la llamada a addActionListenercontenedor.add( campoIntroducir, BorderLayout.NORTH );areaPantalla = new JTextArea();contenedor.add( new JScrollPane( areaPantalla ),BorderLayout.CENTER );setSize( 400, 300 );setVisible( true );// crear objeto DatagramSocket para enviar y recibir paquetestry {socket = new DatagramSocket();}// atrapar los problemas que pueden ocurrir al crear objeto DatagramSocketcatch( SocketException excepcionSocket ) {excepcionSocket.printStackTrace();System.exit( 1 );}} // fin del constructor de Cliente// esperar a que lleguen los paquetes del Servidor, mostrar el contenido de los paquetesprivate void esperarPaquetes(){while ( true ) { // iterar infinitamente// recibir el paquete y mostrar su contenidotry {// establecer el paquetebyte datos[] = new byte[ 100 ];DatagramPacket recibirPaquete = new DatagramPacket(datos, datos.length );socket.receive( recibirPaquete ); // esperar un paquete// mostrar el contenido del paquetemostrarMensaje( "\nPaquete recibido:" +"\nDel host: " + recibirPaquete.getAddress() +"\nPuerto del host: " + recibirPaquete.getPort() +"\nLongitud: " + recibirPaquete.getLength() +"\nContenido:\n\t" + new String( recibirPaquete.getData(),0, recibirPaquete.getLength() ) );}// procesar los problemas que pueden ocurrir al recibir o mostrar el paquetecatch( IOException excepcion ) {mostrarMensaje( excepcion.toString() + "\n" );excepcion.printStackTrace();}} // fin de instrucción while} // fin del método esperarPaquetes// método utilitario que es llamado desde otros subprocesos para manipular a// areaPantalla en el subproceso despachador de eventosprivate void mostrarMensaje( final String mensajeAMostrar ){// mostrar mensaje del subproceso de ejecución despachador de eventosSwingUtilities.invokeLater(new Runnable() { // clase interna para asegurar que la GUI se actualice apropiadamentepublic void run() // actualiza areaPantalla{areaPantalla.append( mensajeAMostrar );areaPantalla.setCaretPosition(areaPantalla.getText().length() );}} // fin de la clase interna); // fin de la llamada a SwingUtilities.invokeLater}public static void main( String args[] ){JFrame.setDefaultLookAndFeelDecorated(true);Cliente aplicacion = new Cliente();aplicacion.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );aplicacion.esperarPaquetes();}} // fin de la clase Cliente