Está en la página 1de 10

//fig. 18.7: Cliente.

java
//Cliente que envia 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 la GUI y DatagramSocket
public Cliente()
{
super("Cliente");

Container contenedor=getContentPane();

campoIntroducir=new JTextField("Escriba aqui el mensaje");
campoIntroducir.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent evento)
{
//crear y enviar el paquete
try{
areaPantalla.append("\nEnviando paquete que
contiene:"+evento.getActionCommand()+"\n");

//obtener mensaje del campo de texto y
convertirlo en arreglo byte
String mensaje=evento.getActionCommand();
byte datos[]=mensaje.getBytes();

//crear enviarPaquete
DatagramPacket enviarPaquete=new
DatagramPacket(datos,datos.length, InetAddress.getLocalHost(),5000);

socket.send(enviarPaquete);//enviar paquete
areaPantalla.append("Paquete enviado \n");

areaPantalla.setCaretPosition(areaPantalla.getText().length());
}
//procesar los problemas que pueden ocurrir al crear o
enviar el paquete
catch(IOException excepcionES){
mostrarMensaje(excepcionES.toString()+"\n");
excepcionES.printStackTrace();
}
}//fin de la actionPerformed
}//fin de la clase interna
);//fin de la llamada a addActionListener

contenedor.add(campoIntroducir, BorderLayout.NORTH);
areaPantalla=new JTextArea();
contenedor.add(new JScrollPane(areaPantalla),BorderLayout.CENTER);

setSize(400,300);
setVisible(true);

//crear y enviar DatagramSocket para enviar y recibir paquetes
try{
socket=new DatagramSocket();
}

//atrapar los problemas que puedan ocurrir al crear objeto
DatagramSocket
catch(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 paquetes
private void esperarPaquetes()
{
while(true){//iterar infinitamente

//recibir el paquete y mostrar su contenido
try{

//establecer el paquete
byte datos[]=new byte[100];
DatagramPacket recibirPaquete= new
DatagramPacket(datos,datos.length);

socket.receive(recibirPaquete);//esperar un paquete

//mostrar el contenido del paquete
mostrarMensaje("\nPaquete recibido:"+"\nDel
host:"+recibirPaquete.getAddress()+"\nPuerto del
host:"+recibirPaquete.getPort()+"\nLongitud:"+recibirPaquete.getLength()+"\nContenido:\n\t"+ne
w String(recibirPaquete.getData(),0,recibirPaquete.getLength()));

}

//procesar los problemas que pueden ocurrir al recibir o mostrar el paquete
catch(IOException excepcion){
mostrarMensaje(excepcion.toString()+"\n");
excepcion.printStackTrace();
}
}//fin de la instruccion while
}//fin del metodo esperarPaquetes

//metodo 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 ejecucion despachador de eventos
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
}

public static void main (String args[])
{
Cliente aplicacion=new Cliente();
aplicacion.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
aplicacion.esperarPaquetes();
}
}//fin de la clase Cliente



//Fig. 18.6: Servidor.java
//Servidor que recibe y envia 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 la GUI y DatagramSocket
public 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 paquetes
try{
socket=new DatagramSocket(5000);
}

//procesar los problemas que pueden ocurrir al crear el objeto DatagramSocket
catch(SocketException excepcionSocket){
excepcionSocket.printStackTrace();
System.exit(1);
}
}//fin del constructor del Servidor

//esperar a que lleguen los paquetes, mostrar los datos y repetir el paquete al cliente
private void esperarPaquetes()
{
while(true){//iterar infinitamente

//recibir paquete, mostrar su contenido, devolver copia al cliente
try{
//establecer el paquete
byte datos[]=new byte[100];
DatagramPacket recibirPaquete=new DatagramPacket(datos,
datos.length);

socket.receive(recibirPaquete);//esperar el paquete

//mostrar la informacion del paquete recibido
mostrarMensaje("\nPaquete recibido:"+"\nDel
host:"+recibirPaquete.getAddress()+"\nPuerto del
host:"+recibirPaquete.getPort()+"\nLongitud:"+recibirPaquete.getLength()+"\nContenido:\n\t"+ne
w String(recibirPaquete.getData(),0,recibirPaquete.getLength()));


enviarPaqueteACliente(recibirPaquete);//enviar paquete al cliente
}

//procesar los problemas que pueden ocurrir al manipular el paquete
catch(IOException excepcionES){
mostrarMensaje(excepcionES.toString()+"\n");
excepcionES.printStackTrace();
}
}//fin de instruccion while
}//fin del metodo esperarPaquetes

//repetir el paquete al cliente
private void enviarPaqueteACliente(DatagramPacket recibirPaquete)
throws IOException
{
mostrarMensaje("\n\nRepitiendo datos al cliente...");

//crear paquete a enviar
DatagramPacket enviarPaquete=new
DatagramPacket(recibirPaquete.getData(),recibirPaquete.getLength(),recibirPaquete.getPort());

socket.send(enviarPaquete);//enviar el paquete
mostrarMensaje("Paquete enviado\n");

}

//metodo utilitario que es llamado desde otros subprocesos para manipular a
areaPantalla en el subproceso despachador de eventos
private void mostrarMensaje(final String mensajeMostrar)
{
//mostrar el mensaje del subproceso de ejecucion despachador de
eventos
SwingUtilities.invokeLater(
new Runnable(){//clase interna para asegurar que la GUI se
actualice apropiadamente

public void run()//actualiza areaPantalla
{
areaPantalla.append(mensajeMostrar);

areaPantalla.setCaretPosition(areaPantalla.getText().length());

}
}//fin de la clase interna

);//fin de la llamadaa SwingUtilities.invokeLater
}

public static void main (String args[])
{
servidor aplicacion=new servidor();
aplicacion.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
aplicacion.esperarPaquetes();
}

}//fin de la clase Servidor

También podría gustarte