Sunteți pe pagina 1din 7

Redes en Java

En Java, las herramientas de red fundamentales provienen de clases e interfaces del paquete
java.net, a travs delas cuales se pueden establecer comunicaciones basadas en flujos, que
permiten a las aplicaciones ver las redes como flujos de datos. La tarea se convierte entonces
en la lectura o escritura de un flujo o archivo, pero con el archivo ubicado en una
computadora remota. Tambin es posible establecer comunicaciones basadas en paquetes.
El modelo que se implementa es el que corresponde a una relacin cliente-servidor, donde
el cliente realiza una peticin, que provoca en el servidor una accin para proporcionar una
respuesta. Cliente y servidor son procesos. Para comunicarse deben establecerse flujos de
bits entre ellos. Los orgenes y destinos de esos flujos, son sockets (elementos de conexin).
El socket es una abstraccin implementada mediante el software, que representa los
terminales de una conexin entre dos mquinas.
Cada dispositivo en una red tiene su identificacin nica, su direccin de red IP. La misma se
representa mediante la clase InetAddress, cuyo mtodo esttico getLocalHost() devuelve
un objeto InetAddress para la computadora local, conteniendo su nombre en la red y su
direccin IP (los mtodos no estticos getHostName() y getHostAddress() proporcionan
esos componentes de manera separada, en formato String). Lo mismo genera el mtodo
esttico getByName(String) si se proporciona el nombre de una direccin (por ejemplo, una
direccin www, o el nombre de un dispositivo en la red, o una direccin IP -como String-). El
mtodo no esttico getAddress() de la clase InetAddress devuelve un vector de bytes con
los 4 componentes de la direccin IP (bytes con signo, que deben ser operados con & 255
para representarlos sin signo).
Los
mtodos
boolean
isAnyLocalAddress()
e
isReachable(int),
permiten,
respectivamente, conocer si el objeto InetAddress al que se aplican, representa una
direccin local, y si es posible intercambiar datos con la direccin por l representada (el
parmetro de tipo int especifica un tiempo de timeout o espera).
Por ejemplo, para conocer el nombre y direccin de la PC:
import java.net.*;
public class IP_Host_PC
{

returnipAddress;
}

private static String ipAString(byte[] ip)


{
String ipAddress = "";
for (inti=0; i<ip.length; i++)
{
if (i> 0)
{
ipAddress += ".";
}
ipAddress += ip[i] & 255;
}

public static void main(String[] parms) throws


Exception
{
InetAddress
direccionPC
=
InetAddress.getLocalHost();
System.out.println(direccionPC);
System.out.println(direccionPC.getHostName());
System.out.println(ipAString(direccionPC.getAddress(
)));
}
}

En Java entonces, las comunicaciones se basan en sockets, que permiten a las aplicaciones
ver las redes como si fueran enlaces de E/S de archivos: un programa puede leer o escribir en
un socket tan simplemente como se lee o escribe en un archivo, siendo un socket una
construccin de software que representa un extremo de una conexin de red.
Se puede emplear un modo stream, con el protocolo TCP (Transmission Control Protocol,
orientado a la conexin, con mayor fiabilidad con acuse de recibo-), a travs de sockets de
flujo que conecten dos procesos, entre los cuales los datos circularn como flujos continuos.
El modo datagrama utiliza el protocolo UDP (User Datagram Protocol, no orientado a la
conexin, con mayor performance menor congestin, mayor velocidad-). Con sockets de
datagramas se transmitirn paquetes de informacin, proporcionando un servicio sin
conexin que no garantiza un orden especfico en la entrega de los paquetes, pero
incrementa el rendimiento.
El socket contiene dispositivo (identificado por nmero de IP), y proceso (nmero de puerto,
que indica una direccin de memoria).
Lista (parcial) de puertos bien conocidos (a los cuales se dirige un cliente para
obtener un servicio)
Puerto Proceso

Puerto Proceso

20

21

ftp (datos)

ftp (control)

Puerto Proceso

23

telnet

25
53
69
80

smtp
dns
tftp
html

110
143
443
465

pop3
IMAP
https
smtp

2049 NFS
3306 MySQL
6881 BitTorrent
19226PandaSecurity

Sockets de flujo
Pasos para establecer un servidor

1. Crear un objeto ServerSocket:


ServerSocket servidor = new ServerSocket(numeroPuerto[, longitudColaEspera])
Un objeto ServerSocket tiene por finalidad esperar que un cliente intente conectarse, y
generar cuando ello ocurra un objeto Socket a travs del cual se realizar la
comunicacin.
El parmetro numeroPuerto registra un nmero de puerto TCP disponible, y ser
utilizado por los clientes para localizar la aplicacin servidor en el equipo servidor (se lo
suele denominar handshake o punto de negociacin). Ese nmero puede estar entre 0 y
65535, pero en general los nmeros menores a 1024 estn reservados para servicios del
sistema. El segundo parmetro, opcional, especifica la cantidad mxima de clientes que
pueden estar en espera de conectarse.
El puerto no es una ubicacin fsica, sino una abstraccin software, para implementar un
segundo nivel de direccionamiento. En esa direccin lgica se brinda un servicio para el
cliente.
Si se especifica un puerto que ya est en uso, o es incorrecto, se genera una excepcin
BindException.
El constructor establece el puerto donde el servidor espera las conexiones de los clientes.
Slo una aplicacin puede enlazarse a un puerto especfico en el servidor para negociar el
enlace.
2. Establecer para ese objeto una espera de la conexin de un cliente, y generar un objeto
Socket que represente la conexin: Socket conexion = servidor.accept();
El mtodo accept() queda a la espera de una conexin, y devuelve un objeto Socket
cuando la misma se establece. Dicho objeto permite al servidor interactuar con el cliente.
Las interacciones ocurren en un puerto del servidor distinto al del punto de negociacin,
de tal manera que el puerto original puede usarse nuevamente en un servidor con
subprocesamiento mltiple.
El mtodo getInetAddress() de Socket devuelve un objeto InetAddress que contiene
informacin acerca del equipo cliente. Por ejemplo con el mtodo getHostName() de
InetAddress se obtiene el nombre de host del equipo cliente.
3. Obtener objetos OutputStream e InputStream que permiten al servidor comunicarse con
el cliente, enviando y recibiendo bytes, mediante los mtodos getOutputStream() y
getInputStream():
ObjectInputStream entrada = new
ObjectInputStream(conexion.getInputStream());
ObjectOutputStream salida = new
ObjectOutputStream(conexion.getOutputStream());

En lo anterior se envuelven los objetos OutputStream e InputStream en flujos de tipo


Object ObjectOutputStream y ObjectInputStream. Estos son flujos que se implementan
con bferes, de manera que tras enviar algo a la salida, debe invocarse el mtodo flush()
de la misma.
Para usar flujos de texto, una opcin sera:
Scanner entrada = new Scanner(conexion.getInputStream());
Formatter salida = new Formatter(conexion.getOutputStream());

4. Procesamiento, en conjunto con la comunicacin a travs de los objetos InputStream


(entrada) y OutputStream (salida), leyendo mediante entrada.readObject() y
escribiendo mediante salida.writeObject() (ya que los flujos Stream estn envueltos
por objeto ObjectStream).
En caso de flujos de texto, la comunicacin se hara mediante entrada.nextInt() (o
entrada.nextLine()) y salida.format(), por ejemplo.
5. Cerrar la conexin: salida.close();
entrada.close();
conexion.close();
Pasos para establecer un cliente utilizando sockets de flujo
1. Crear un objeto Socket: Socket conexion = new Socket(direccionServidor,
numeroPuerto)

El constructor de Socket establece la conexin al servidor. Una conexin fallida originar


la excepcin IOException. Si no se puede resolver la direccin del servidor se genera la
excepcin UnknownHostException.
Dos referencias especiales son la direccin IP 127.0.0.1, o su equivalente nombre de host
localhost, que sealan al equipo local, y permiten probar aplicaciones de red en el
equipo local (simulando una red por software).
Para referenciar al servidor local se pueden emplear tambin las expresiones:
InetAddress.getByName(null),
InetAddress.getByName(localhost),
InetAddress.getByName(127.0.0.1) InetAddress.getLocalHost().
2. Obtener objetos OutputStream e InputStream que permiten al cliente comunicarse con
el servidor, enviando y recibiendo bytes, mediante los mtodos getOutputStream() y
getInputStream():
ObjectOutputStream salida = new
ObjectOutputStream(conexion.getOutputStream());
ObjectInputStream entrada = new
ObjectInputStream(conexion.getInputStream());

En lo anterior se envuelven los objetos OutputStream e InputStream en los flujos de tipo


ObjectObjectOutputStream y ObjectInputStream. Estos son flujos que se
implementan con bferes, de manera que tras enviar algo a la salida, debe invocarse el
mtodo flush() de la misma.
Para usar flujos de texto, una opcin sera:
Scanner entrada = new Scanner(conexion.getInputStream());
Formatter salida = new Formatter(conexion.getOutputStream());

3. Procesamiento, en conjunto con la comunicacin a travs de los objetos entrada y salida


(leyendo
mediante
entrada.readObject()
y
escribiendo
mediante
salida.writeObject()).
En caso de flujos de texto, la comunicacin se hara mediante entrada.nextLine() y
salida.format(), por ejemplo.
4. Cerrar la conexin: entrada.close();
salida.close();
conexion.close();
El cliente debe detectar cuando el servidor termina de enviar informacin, para cerrar la
conexin. El mtodo read() de InputStream devuelve -1 cuando detecta el fin del flujo.
Con un objeto ObjectInputStream se produce una excepcin EOFException cuando se
trata de leer en un flujo que finaliz.
Sockets de datagramas
El protocolo UDP es ms simple que TCP. Surgen entonces diferencias en el uso, por ejemplo
los sockets UDP no necesitan negociar una conexin antes de su uso. Mientras TCP es anlogo
al proceso detrs de una comunicacin telefnica, UDP es similar a una comunicacin por
correo. No se necesita una conexin preestablecida, pero s direccionar correctamente el
destino. Un socket UDP puede usarse para enviar y recibir mensajes hacia y desde cualquier
direccin.
Pasos para establecer un servidor utilizando sockets de datagramas
1. Construir una instancia de DatagramSocket, especificando puerto y opcionalmente
direccin local.
DatagramSocket socket = new DatagramSocket(4445); // al intentar este cdigo, se debe
considerar la excepcin IOException

2. Recibir una instancia de DatagramPacket usando el mtodo receive() de


DatagramSocket. El datagrama recibido contiene la direccin del cliente para enviar una
posible respuesta.
byte datos[] = new byte[tamaoPaquete]; // tamaoPaquete es un int
DatagramPacket paqueteRecibido = new DatagramPacket(datos, datos.length);
socket.receive(paqueteRecibido); // espera el paquete, el contenido del mismo se obtiene con getData(), su
longitud
con
getLength(),
y
se
convierte
a
String
String(paqueteRecibido.getData(), 0, paqueteRecibido.getLength()

mediante:

new

3. Llevar a cabo la comunicacin enviando y recibiendo instancias de DatagramPacket


usando los mtodos send() y receive() de DatagramSocket.
byte datos[] = mensaje.getBytes(); // mensaje es de tipo String

DatagramPacket
paquete
=
new
DatagramPacket(datos,
paqueteRecibido.getAddress(), paqueteRecibido.getPort());
socket.send(paquete);

datos.length,

4. Liberar la memoria del socket usando el mtodo close() de DatagramSocket.


Pasos para establecer un cliente utilizando sockets de datagramas
1. Construir una instancia de DatagramSocket, especificando opcionalmente direccin local
y puerto.
DatagramSocket socket = new DatagramSocket(); // al intentar este cdigo, se debe considerar
la excepcin SocketException

2. Llevar a cabo la comunicacin enviando y recibiendo instancias de DatagramPacket


usando los mtodos send() y receive() de DatagramSocket.
byte datos[] = mensaje.getBytes(); // mensaje es de tipo String
DatagramPacket
paquete
=
new
DatagramPacket(datos,
InetAddress.getByName(server), 4445); // mensaje es de tipo String, al igual que server

socket.send(paquete); //

debe atraparse la excepcin IOException

byte datos[] = new byte[tamaoPaquete]; // tamaoPaquete es un int


DatagramPacket paqueteRecibido = new DatagramPacket(datos, datos.length);
Socket.receive(paqueteRecibido); // espera el paquete
// mostrar mensaje

3. Liberar la memoria del socket usando el mtodo close() de DatagramSocket.


Referencias:

http://docs.oracle.com/javase/tutorial/networking/TOC.html

datos.length,

Cuestionario
1. Qu finalidades tienen un objeto ServerSocket, y un objeto Socket?
2. En qu se convierten los intercambios entre computadoras, empleando Sockets?
3. Qu diferencia el intercambio en modo stream y en modo datagrama?
4. Qu modelo implementa la comunicacin a travs de Sockets?
5. Cmo se generan el Socket del lado del servidor, y el correspondiente en el lado del
cliente?
6. Qu representa la direccin IP 127.0.0.1 (o el nombre equivalente localhost), y qu
permite su uso?
7. Qu informacin debe proporcionarse a un objeto ServerSocket?
8. Qu informacin debe proporcionarse a un objeto Socket para comunicarse con el
anterior?
9. Qu mtodos, y de qu objeto, proporcionan los flujos de entrada y salida para
comunicarse con otra direccin IP?
10.Qu papel desempea un objeto DatagramSocket en relacin a un objeto
DatagramPacket?
11.Qu informacin debe proporcionarse a un objeto DatagramPacket, cuando es recibido?
Y cuando es enviado?
12.Qu mtodos, y de qu objeto, permiten enviar y recibir paquetes desde otra direccin de
la red?
Ejercicios
Codificar un servidor y un cliente que, utilizando TCP, permitan entablar una conversacin o
chat, escribiendo en un cuadro de texto el mensaje que se enviar a la otra terminal, y
mostrando en un rea de texto los mensajes enviados y recibidos.
Codificar un servidor y un cliente que, utilizando UDP, permitan entablar una conversacin o
chat, escribiendo en un cuadro de texto el mensaje que se enviar a la otra terminal, y
mostrando en un rea de texto los mensajes enviados y recibidos.
Codificar un servidor y un cliente que, utilizando TCP, permitan realizar la transferencia
(copia) de un archivo, desde un dispositivo en una red, hacia otro.
Disear un diagrama de clases que se corresponda con una implementacin del juego de
tatet donde los jugadores puedan estar en computadoras distantes. Comentar qu
representan las variables de instancia empleadas, y las finalidades de los mtodos a codificar.
Implementar el diseo anterior.

S-ar putea să vă placă și