You are on page 1of 8

YINA PAOLA GONZÁLEZ

COD. 01170079
PROGRAMACION EN JAVA
ING. JUAN CARLOS DIAZ
U. EL BOSQUE
21 DE MAYO DE 2005

COMUNICACIÓN POR SOCKETS

OBJETIVOS

• Tener la capacidad de identificar y describir en el API las librerías apropiadas


para el manejo adecuado en mi proyecto.

• Capacidad de identificación de las clases principales, métodos y demás


variables dentro del API.

• Afianzar mis conocimientos vistos durante todo el semestre para así lograr
un buen proyecto sobre las comunicaciones por sockets.

MARCO TEORICO

COMUNICACIÓN POR SOCKETS

La comunicación por sockets es transferir información de una maquina a otra. La


comunicación se lleva acabo descomponiendo estos datos que se transfieren en
paquetes y luego se logra transmitir estos paquetes. Toda maquina en Internet
debe disponer mínimo de un enrutador (routers) y a su vez este enrutador debe
estar conectado a otro enrutador para así formar una vía por router entre dos
maquinas cualquiera; aunque este tipo de comunicación es poco confiable porque
los paquetes se pueden perder en el camino, por esto los computadores poseen un
software llamado Protocolo de Internet o IP, para a si conseguir una capacidad
mejorada, que se llama Protocolo de Control de Transmisión o bien TCP/IP.

SOCKETS

Los Sockets o enchufes son semejantes a conexiones telefónicas entre dos


ordenadores remotos, la comunicación es continúa y finaliza cuando uno de los dos
ordenadores cierra su conexión. Una conexión socket TCP/IP se realiza directamente
con el paquete java.net. Algunas clases utilizan el paquete sun.net.

El modelo de sockets más simple es:

Cliente / Servidor

Normalmente la comunicación entre dos ordenadores se realiza mediante Cliente-


Servidor. El usuario Cliente desea obtener unos servicios de la máquina remota
(Servidor). Para ello, el Servidor proporciona un puerto de comunicaciones donde
deben conectarse todos los Clientes que deseen obtener dicho servicio.
Estableciendo un socket en la máquina local (Cliente) y otro en la máquina remota
(Servidor) y comunicándolos entre sí por el puerto proporcionado.
El cliente es normalmente la parte que inicia la comunicación entre dos máquinas.
El servidor es normalmente la parte que acepta las peticiones de conexión.
Un cliente puede crear un socket para iniciar la comunicación con el servidor en el
momento que desee. El servidor debe estar siempre preparado para escuchar las
posibles peticiones de conexión de los clientes.

Los clientes realizan generalmente funciones como:

• Manejo de la interfase del usuario.


• Captura y validación de los datos de entrada.
• Generación de consultas e informes sobre las bases de datos.

Los servidores realizan las siguientes funciones:

• Gestión de periféricos compartidos.


• Control de accesos concurrentes a bases de datos compartidas.
• Enlaces de comunicaciones con otras redes de área local o extensa.
• Siempre que un cliente requiere un servicio lo solicita al servidor
correspondiente y éste, le responde proporcionándolo. Normalmente, pero
no necesariamente, el cliente y el servidor están ubicados en distintos
procesadores. Los clientes se suelen situar en ordenadores personales y/o
estaciones de trabajo y los servidores en procesadores departamentales o
de grupo.

Entre las principales características de la arquitectura cliente / servidor se destacan


las siguientes:

• El servidor presenta a todos sus clientes una interfase única y bien definida.
• El cliente no necesita conocer la lógica del servidor, sólo su interfase
externa.
• El cliente no depende de la ubicación física del servidor, ni del tipo de equipo
físico en el que se encuentra, ni de su sistema operativo.
• Los cambios en el servidor implican pocos o ningún cambio en el cliente.

Tipos de sockets

TCP sockets (En Java implementados en la clase Socket): Ofrecen una


comunicación fiable y libre de errores, garantizando que los mensajes llegarán
ordenados, sin duplicados y sin pérdidas. Antes de comenzar la transmisión
necesitan una fase previa de establecimiento de la conexión. El protocolo TCP
necesita dos tipos de información: la dirección IP y el número de puerto.

UDP sockets (En Java implementados en la clase DatagramSocket): Ofrecen


un servicio no fiable de comunicación. Los paquetes pueden llegar duplicados,
desordenados, o pueden perderse sin llegar a su destino. La comunicación es
mucho más rápida que en los TCP Sockets, y no necesitan una fase de
establecimiento de conexión. Los sockets UDP no hacen diferenciación entre
máquina cliente o servidor. Utilizan la misma clase de socket para el envío de datos
y la escucha de conexiones entrantes. Los sockets UDP no permiten tratar la
conexión de red como un stream, es decir, UDP siempre trabaja con paquetes
datagrama individuales.

Los UDP no son buenos para aplicaciones como ftp que necesitan una transmisión
segura de datos a través de redes no seguras. Sin embargo hay muchas otras
clases de aplicaciones en las que priva la velocidad antes que la seguridad. Por
ejemplo: el envío de datos de audio o vídeo en tiempo real.

En UDP hay un límite de tamaño de los datagramas, establecido en 64 kilo bites,


que se pueden enviar a una localización determinada, mientras que TCP no tiene
límite; una vez que se ha establecido la conexión, el par de sockets funciona como
los streams: todos los datos se leen inmediatamente, en el mismo orden en que se
van recibiendo.

Los datagramas son bloques de información del tipo lanzar y olvidar. Para la
mayoría de los programas que utilicen la red, el usar un flujo TCP en vez de un
datagrama UDP es más sencillo y hay menos posibilidades de tener problemas. Sin
embargo, cuando se requiere un rendimiento óptimo, y está justificado el tiempo
adicional que supone realizar la verificación de los datos, los datagramas son un
mecanismo realmente útil.

En resumen, TCP parece más indicado para la implementación de servicios de red


como un control remoto (rlogin, telnet) y transmisión de ficheros (ftp); que
necesitan transmitir datos de longitud indefinida. UDP es menos complejo y tiene
una menor sobrecarga sobre la conexión; esto hace que sea el indicado en la
implementación de aplicaciones cliente/servidor en sistemas distribuidos montados
sobre redes de área local.

TCP SOCKETS

CLASE SOCKET

Mediante la clase Socket incluida en el paquete java.net podemos crear conexiones


de flujo, entre dos ordenadores. Es el objeto básico en toda comunicación a través
de Internet, bajo el protocolo TCP. Esta clase proporciona métodos para la
entrada/salida a través de streams que hacen la lectura y escritura a través de
sockets muy sencilla.

Constructores de sockets:

protected Socket() Crea un socket sin ningún tipo de conexión


Crea un stream socket y lo conecta a un puerto de una
public Socket(String host, máquina remota.
int port) throws host: Nombre de la máquina remota.
UnknownHostException, port: Puerto de la máquina remota.
IOException UnknownHostException, IOException: Si ocurre un
error durante la conexión
Crea un stream socket y lo conecta a un puerto de una
public Socket(InetAddress
dirección IP.
address,
address: Dirección IP de la máquina remota.
int port) throws
port: Puerto de la máquina remota.
IOException
IOException: Si ocurre un error durante la conexión
public Socket(String host, Crea un socket y lo conecta a un puerto de una
int port, máquina remota. Además, el socket hará un bind() a la
InetAddress máquina y puerto local (enlazará a ambos).
localAddr, host: Nombre de la máquina remota.
int localPort) port: Puerto de la máquina remota.
throws IOException localAddr: Dirección IP de la máquina local.
localPort: Puerto de la máquina local.
IOException: Si ocurre un error durante la conexión
Crea un socket y lo conecta a un puerto de una
public Socket(InetAddress
dirección IP. Además, el socket hará un bind() a la
address,
máquina y puerto local (enlazará a ambos).
int port,
address: Dirección IP de la máquina remota.
InetAddress
port: Puerto de la máquina remota.
localAddr,
localAddr: Dirección IP de la máquina local.
int localPort)
localPort: Puerto de la máquina local.
throws IOException
IOException: Si ocurre un error durante la conexión

Métodos:

Devuelve la dirección IP a la cual está


public InetAddress getInetAddress()
conectado el socket.
Devuelve la dirección local a la cual el socket
public InetAddress getLocalAddress()
está enlazado.
Devuelve el puerto remoto al cual está
public int getPort()
conectado el socket.
Devuelve el puerto local al cual está enlazado
public int getLocalPort()
el socket.
Devuelve un stream de entrada (lectura de
public InputStream getInputStream() bytes) para el socket.
throws IOException IOException: Si ocurre un error durante la
creación del stream de entrada.
Devuelve un stream de salida (escritura de
public OutputStream
bytes) para el socket.
getOutputStream() throws
IOException: Si ocurre un error durante la
IOException
creación del stream de salida.
Cierra el socket.
public synchronized void close()
IOException: Si ocurre un error al cerrar el
throws IOException
socket.
public String toString() Convierte el socket en un string.

Excepciones:

• BindException: Se produce cuando intentas construir un objeto Socket o


ServerSocket en un puerto local que está en uso; o si no tienes suficientes
privilegios para construirlo.
• ConnectException: Se produce cuando una conexión es rechazada por el
host remoto. Normalmente porque el host está ocupado o no está
escuchando por ese puerto.
• NoRouteToHostException: Indica que a la conexión se le ha acabado el
tiempo de establecimiento de la conexción.
• SocketException: Si ocurre un error en el socket.
• UnknownHostException: Si no encuentra la maquina con la cual
queremos establecer la conexión.

CLASE SERVERSOCKET

Es una clase incluida en java.net que sirve para atender peticiones de conexiones,
lo cual es útil a la hora de crear un servidor. Este objeto no realiza el servicio, sino
que crea un objeto Socket en función del cliente para realizar toda la comunicación
a través de él.

CLASE NETWORKSERVER

Una clase creada para implementar métodos y variables utilizadas en la creación de


un servidor TCP/IP.

CLASE NETWORKCLIENT

Una clase creada para implementar métodos y variables utilizadas en la creación de


un cliente TCP/IP.

UDP SOCKETS

CLASE DATAGRAMSOCKET

Son un servicio de transporte sin conexión. Son más eficientes que TCP, pero no
está garantizada la fiabilidad. Los datos se envían y reciben en paquetes, cuya
entrega no está garantizada. Los paquetes pueden ser duplicados, perdidos o llegar
en un orden diferente al que se envió.

El protocolo de comunicaciones con datagramas es un protocolo sin conexión, es


decir, cada vez que se envíen datagramas es necesario enviar el descriptor del
socket local y la dirección del socket que debe recibir el datagrama. Como se puede
ver, hay que enviar datos adicionales cada vez que se realice una comunicación.

La clase de sockets datagrama puede ser utilizada para implementar datagramas


no fiables (sockets UDP), no ordenados. Aunque la comunicación por estos sockets
es muy rápida porque no hay que perder tiempo estableciendo la conexión entre
cliente y servidor.

Constructores para DatagramSocket:

Crea un socket datagrama, y lo enlaza a


cualquier puerto que haya libre en la máquina
public DatagramSocket() throws local.
SocketException IOException: Si ocurre un error durante la
creación del socket datagrama, o al intentar
enlazarlo a un puerto libre.
Crea un socket datagrama, y lo enlaza a el
puerto especificado.
port: Puerto al que se debe enlazar el socket
public DatagramSocket(int port)
datagrama (debe estar entre 0 y 65535).
throws SocketException
IOException: Si ocurre un error durante la
creación del socket datagrama, o al intentar
enlazarlo al puerto.
public DatagramSocket(int port, Crea un socket datagrama, y lo enlaza a una
InetAddress laddr) throws determinada máquina.
SocketException port: Puerto al que se debe enlazar el socket
datagrama (debe estar entre 0 y 65535).
InetAddress: Dirección de la máquina a la que
conectaremos el socket datagrama.
IOException: Si ocurre un error durante la
creación del socket datagrama, o al intentar
enlazarlo al puerto.

Métodos:

public void Envía un paquete datagrama por este socket


send(DatagramPacket p) IOException: Si ocurre un error en la operación de
throws IOException envío.
Recibe un paquete datagrama desde este socket. Este
método bloquea la ejecución del programa hasta que
public synchronized void el paquete datagrama haya sido recibido. Si el
receive(DatagramPacket p) mensaje es más grande que el buffer de recepción, el
throws IOException mensaje será cortado.
IOException: Si ocurre un error en la operación de
recepción.
public InetAddress Devuelve la dirección local a la cual el socket está
getLocalAddress() escuchando.
public void close() throws Cierra el socket.
IOException IOException: Si ocurre un error al cerrar el socket.
Devuelve el puerto local al cual está enlazado el
public int getLocalPort()
socket.

CLASE DATAGRAMPACKETS

Un DatagramPacket introduce datos dentro de un paquete UDP llamado datagrama;


y extrae los datos cuando recibe un datagrama.

De esta forma, para enviar datos, se introducen dentro de un paquete datagrama, y


envías dicho paquete a través de un socket datagrama. Para recibir datos,
recibimos un paquete datagrama desde un socket datagrama, y luego leemos el
contenido de dicho paquete.

Constructores para DatagramPacket:

Construye un paquete datagrama para recibir mensajes de


public
una longitud igual a ilength.
DatagramPacket(byte
ibuf: buffer donde se almacenará el mensaje.
ibuf[],
ilength: longitud del buffer. Debe ser menos que la longitud
int ilength)
de ibuf.
public Construye un paquete datagrama para enviar mensajes de
DatagramPacket(byte una longitud igual a ilength, a la máquina y puerto
ibuf[], especificados.
int ibuf: buffer donde se almacenará el mensaje.
ilength, ilength: longitud del buffer. Debe ser menos que la longitud
de ibuf.
InetAddress iaddr, iaddr: Dirección de la máquina remota.
int iport) iport: Puerto de la máquina remota.
Métodos:

public synchronized Devuelve la dirección IP de la máquina a la cual está


InetAddress getAddress() siendo enviado el datagrama.
public synchronized int Devuelve el puerto de la máquina a la cual está
getPort() siendo enviado el datagrama.
public synchronized byte[] Devuelve los datos recibidos o los datos a ser
getData() mandados.
public synchronized int Devuelve la longitud de los datos a ser mandados, o
getLength() de los dados recibidos.

CLASE MULTICASTSOCKET

Clase utilizada para crear una versión multicast de las clase socket datagrama.
Múltiples clientes/servidores pueden transmitir a un grupo multicast (un grupo de
direcciones IP compartiendo el mismo número de puerto).

SOCKETS STREAM (TCP, Transport Control Protocol)

Son un servicio orientado a conexión donde los datos se transfieren sin


encuadrarlos en registros o bloques. Si se rompe la conexión entre los procesos,
éstos serán informados.

El protocolo de comunicaciones con streams es un protocolo orientado a conexión,


ya que para establecer una comunicación utilizando el protocolo TCP, hay que
establecer en primer lugar una conexión entre un par de sockets. Mientras uno de
los sockets atiende peticiones de conexión (servidor), el otro solicita una conexión
(cliente). Una vez que los dos sockets estén conectados, se pueden utilizar para
transmitir datos en ambas direcciones.

SOCKETS RAW

Son sockets que dan acceso directo a la capa de software de red subyacente o a
protocolos de más bajo nivel. Se utilizan sobre todo para la depuración del código
de los pr Los sockets raw proporcionan acceso al Internet Control Message Protocol,
ICMP, y se utiliza para comunicarse entre varias entidades IP.

NOTA: Cuando se selecciona un número de puerto, se debe tener en cuenta que


los puertos en el rango 0-1023 están reservados para usuarios con muchos
privilegios (superusuarios o root). Estos puertos son los que utilizan los servicios
estándar del sistema como email, ftp o http. Para las aplicaciones que se
desarrollen, asegurarse de seleccionar un puerto por encima del 1023.

CONCLUSIONES

• Con toda la información recogida me pude empapar del tema y saber como
funcionan las comunicaciones por sockets, que son, para que sirven y la
importancia que tienen en nuestras vidas y en el entorno en el que vivimos.
• Con ayuda del API me pude dar cuenta de que tipos de clases utilizan los
sockets y a su vez en el momento de implementar la práctica manejar
adecuadamente estas y saber si son TCP o UDP.
• Tener cuidado a la hora de mencionar el numero de puerto en la
implementación del programa para un correcto funcionamiento del proyecto.

BIBLIOGRAFÍA

• INTERNET.
• INTRODUCCION A LA PROGRAMACION CON JAVA, Addison Wesley, 2001.
• JAVA FUNDAMENTOS DE PROGRAMACION, Addison Wesley, 2000.
• API.

You might also like