Envio Y Recepcion De Datos Puertos
Cuando se escriben programas Java que se comunican a través de la red, se está programando en la capa de aplicación. Típicamente, no se necesita trabajar con las capas TCP y UDP — en su lugar se puede utilizar las clases del paquete java.net. Estas clases porporcionan comunicación de red independiente del sistema.
A través de las clases del paquete java.net, los programas Java puede utilizan TCP o UDP para comunicarse a través de Internet. Las clases URL, URL Connection?, Socket, y Socket Server? utilizan el TCP para comunicarse a través de la Red. Las clases Datagram Packet? y Datagram Server? utilizan UDP.
TCP proporciona un canal de comunicación fiable punto a punto, lo que utilizan para comunicarse las aplicaciones cliente-servidor en Internet. Las clases Socket y Server Socket? del paquete java.net proporcionan un canal de comunicación independiente del sistema utilizando TCP, cada una de las cuales implementa el lado del cliente y el servidor respectivamente.
La clase Socket del paquete java.net es una implementación independiente de la plataforma de un cliente para un enlace de comunicación de dos vías entre un cliente y un servidor. La clase Socket se sitúa en la parte superior de una implementación dependiente de la plataforma, ocultando los detalles de los sistemas particulares a un programa Java. Utilizando la clase java.net.Socket en lugar de tratar con código nativo, los programas Java pueden comunicarse a través de la red de una forma independiente de la plataforma.
El entorno de desarrollo de Java incluye un paquete, java.io, que contiene un juego de canales de entrada y salida que los programas pueden utilizar para leer y escribir datos. Las clases Input Stream y Output Stream? del paquete java.io son superclases abstractas que definen el comportamiento de los canales de I/O secuenciales de Java. java.io también incluye muchas subclases de Input Stream y Output Stream que implementan tipos especificos de canales de I/O.
Básicamente disponemos de dos tipos de servicio :
Servicio sin conexión , donde el emisor y el receptor intercambian paquetes de información sin establecer una conexión previa , donde tampoco disponemos de un control de secuencia ni control de erores. En este tipo de conexión operamos con Datagramas y el protocolo empleado es UDP.
Servicio orientado a conexión : Donde disponemos de un stream que nos asegura la entrega de la información de forma ordenada y fiable. Operamos con streams y el protocolo empleado es TCP
Java nos da soporte para : . UDP (byte[]) : Datagram Socket?, Datagram Packet
. TCP (streams) : Socket, Server Socket . Direcciones y Nombres : Inet Address?
Datagram Socket (UDP) : Con el podemos enviar y recibir datagramas. Como es sabido UDP no ofrece fiabilidad , los datagramas se pueden perder y no se asegura el orden de llegada. Los objetos enviados o recibidos son de la clase Datagram Packet.
. Constructores : Datagram Socket() , crea un socket para datagramas y lo conecta al primer puerto disponible. Datagram Socket(int) , Igual que el anterior, pero además permite especificar el número de puerto asociado. Datagram Socket (int, Inet Address) , Permite especificar además del puerto, la dirección IP a la que nos vamos a conectar. . Metodos : close () getLocalAddress() getLocalPort() getSoTimeout() receive(Datagram Packet) send(Datagram Packet) setSoTimeout(int)
Datagram Packet (UDP) : Es el objeto que usaremos para enviar datagramas. Contiene : Los datos , La direccion IP (Inet Address) del origen o destino y el puerto origen o destino. Al enviar definimos el destino y al recibir podemos consultar el origen. Inet Address : Métodos : Para obtener y manipular direcciones IP y nombres.
equals (Object)
getAddress() getAllByName(string) getByName(String) getHostAddress() getHostName() getLocalHost() hashCode() isMulticastAddress() toString()
ENVIO Y RECEPCION DE DATOS A TRAVÉS DE SOCKETS :
El servidor crea un Socket, mediante Server Socket, le asigna una dirección y un puerto y acepta llamadas (accept). A partir de este momento el proceso queda bloqueado a la espera de una llamada. Cuando llega una llamada , el accept crea un nuevo socket para procesar dicha llamada. Es unicamente en ese momento cuando existe la conexión y durará hasta que se libere mediante close().
Los sockets tienen asociados un Stream de entrada y otro de salida a través de los cuales se leen y escriben los datos :
. socket.getInputStream() : Devuelve un objeto de tipo Input Stream
. socket.getOutputStream() : Devuelve un objeto de tipo Output Stream
Para enviar datos se puede utilizar el Output Stream del socket, para enviar un flujo de bytes sin buffer. Pero también se puede crear un objeto de tipo stream de datos basado en el Output Stream.
Ejemplo :
Socket socket = new Socket (“158.42.112.67″, 1056);
Print Writer? escribir;
Buffered Reader teclado;
String linea;
teclado = new Buffered Reader(new Input Stream Reader?(System.in));
escribir = new Print Writer(socket.getOutputStream(),true);
do {
linea=teclado.readLine();
escribir.println(linea);
} while (linea.compareTo(“#”)!=0);
….
Para recibir datos se puede utilizar Input Stream o definir un nuevo objeto del mismo tipo más eficiente.
Ejemplo:
Buffered Reader leer;
String s;
leer=new Buffered Reader( new Input Stream Reader (socketRecepcion.getInputStream() ) );
while (“#”.compareTo(s=leer.readLine()!=0) {
System.out.println(nombre+”: “+s);
}
THREADS : En el programa se pueden implementar varios hilos de ejcución o threads. Podemos crear un servidor concurrente que ejecute el mismo código para cada cliente. Para ello podemos implementar un servidor para un solo cliente y dedicar un thread por cliente.
Los Threads se pueden implementar de dos formas :
Implementando una nueva clase derivada de la clase Thread.
Creando una nueva clase que implemente el interface Runnable.
Con lo que el ejemplo anterior de Servidor de Eco Tcp para atender un numero ilimitado de clientes quedaría :
Import java.io.*;
Import java.net.*;
Class Servidor Eco Tcp? extends Thread {
Socket s=null;
Eco Tcp Serv?(Socket s) {this.s=s;}
Public void run() {
Try { Input Stream is=s.getInputStream();
Output Stream os=s.getOutputStream();
While(true) os.write(is.read());
} catch (IO Exception? e) {System.out.println(“Error en socket”);}}
Public static void main(String agrs[]) throws IO Exception , Unknown Host Exception? {
Server Socket ss=new Server Socket(7);
While(true) {
Eco Tcp Serv e=new Eco Tcp Serv(ss.accept());
e.start();
}
}
}
Existe otro tipo de socket , RAW SOCKET que no opera en el nivel de transporte y accede directamente al nivel de red. Este tipo de socket suele ser utilizado por aplicaciones con privilegios para la definicion de protocolos de bajo nivel.
TECNOLOGICO DE FELIPE CARRILLO PUERTO QUINTANA ROO Luis Enrique G R, Raul Koyok, Saul Ake,
INGENIERIA EN SISTEMAS COMPUTACIONALES