sockets tcp

21
Java Advanced Programming Introduccion I http://javacuriosities.blogspot.com.ar/

Upload: luis-miguel-de-bello

Post on 04-Aug-2015

121 views

Category:

Engineering


14 download

TRANSCRIPT

Java Advanced Programming Introduccion I

http://javacuriosities.blogspot.com.ar/

Networking

Cuando hablamos de networking nos estamos refiriendo a la posibilidad de

trabajar con diversas aplicación ubicadas físicamente en distintas

estaciones de trabajo y permitir que se conecten vía una red, para trabajar

de manera cooperativa o simplemente enviar y recibir información.

Java advanced programming

Socket

Un Socket es una representación abstracta del extremo (Endpoint) en un

proceso de comunicación. Para que se dé la comunicación en una Red, el

proceso de comunicación requiere un Socket a cada extremo

Emisor/Receptor y viceversa.

Java advanced programming

Protocolos (Capa 4 - Nivel de Transporte)

Cuando conectamos dos sockets en medio existe algo que se conoce

como protocolo de transporte, aquí estaremos hablando de TCP o UDP.

Java advanced programming

TCP

TCP (Transmission Control Protocol)

- Protocolo de transporte “orientado a conexión”

- Garantiza un servicio extremo a extremo fiable

- Detectar/retransmitir segmentos de datos perdidos o erróneos

- Detectar y descartar segmentos duplicados

- Ordenar los segmentos en el destino y pasarlos de forma ordenada a la capa

de aplicación

- Utilizado en aplicaciones en las que la seguridad en la entrega es más

importante que la rapidez

- Ejemplos: FTP, HTTP, Telnet, SMTP, etc.

Java advanced programming

UDP

UDP(User Datagram Protocol)

- Protocolo de transporte sin conexión

- No garantiza un servicio extremo a extremo fiable

- No controla la pérdida de paquetes, los errores o la duplicidad

- Utilizado en aplicaciones en las que la rapidez en la entrega es más importante

que la seguridad

- Ejemplos: DNS, SNMP, RIP, RTP, etc

Java advanced programming

TCP/UDP

Java advanced programming

Cliente/Servidor

Modelo cliente-servidor

- Es el patrón de comunicación usado por la mayoría de las aplicaciones TCP/UDP

- El funcionamiento básico se emplea en otro modelos (Ejemplo: peer-to-peer)

Cliente

- Es la aplicación que inicia la conexión o el intercambio de datos con la máquina

remota (servidor)

- La aplicación cliente normalmente la arranca un usuario cuando quiere utilizar un

servicio de la red

- Ejemplos: Navegador web (TCP), cliente de e-mail (TCP), consulta al servidor DNS

(UDP)

Servidor

- Es la aplicación que recibe y acepta la solicitud de conexión o intercambio de datos

del cliente

- Esta aplicación normalmente está ejecutándose continuamente en la máquina

remota y está a la espera de solicitudes de clientes

- Ejemplos: Servidor Web (TCP), Servidor de correo electrónico (TCP), Servidor DNS

(UDP) Java advanced programming

Sockets y Puertos

Sockets y Puertos

- El canal de comunicación establecido entre el cliente y el servidor se denomina

“socket” (enchufe)

- El socket permite el intercambio de datos bidireccional entre cliente y servidor

- Cada aplicación servidor o cliente está identificada por un número de puerto

Parámetros en una comunicación TCP o UDP

- Dirección IP del cliente: Identifica a la máquina cliente (la que inicia la conexión o

intercambio de datos)

- Puerto del cliente: Identifica al proceso cliente en la máquina cliente

- Dirección IP del servidor: Identifica a la máquina servidora (la que acepta la

solicitud de conexión o intercambio de datos)

- Puerto del servidor: Identifica al proceso servidor en la máquina servidora

Java advanced programming

Direccion IP

Una dirección IP es un número que identifica de manera lógica y jerárquica a

una interfaz de un dispositivo (habitualmente una computadora) dentro de

una red que utilice el protocolo IP (Internet Protocol), que corresponde al

nivel de red del protocolo TCP/IP.

Dicho número no se ha de confundir con la dirección MAC que es un número

hexadecimal fijo que es asignado a la tarjeta o dispositivo de red por el

fabricante, mientras que la dirección IP se puede cambiar.

Es habitual que un usuario que se conecta desde su hogar a Internet utilice

una dirección IP. Esta dirección puede cambiar cada vez que se conecta; y a

esta forma de asignación de dirección IP se denomina una dirección IP

dinámica.

Los sitios de Internet que por su naturaleza necesitan estar

permanentemente conectados, generalmente tienen una dirección IP fija, es

decir, no cambia con el tiempo. Los servidores de correo, DNS, FTP

públicos, y servidores de páginas web necesariamente deben contar con una

dirección IP fija o estática, ya que de esta forma se permite su localización

en la red.

Java advanced programming

Puerto

Un puerto es una dirección numérica a través de la cual se procesa un

servicio, es decir, no son puertos físicos semejantes al puerto paralelo para

conectar la impresora, sino que son direcciones lógicas proporcionadas por

el sistema operativo para poder responder.

Las comunicaciones de información relacionada con Web tienen lugar a

través del puerto 80 mediante protocolo TCP. Para emular esto en Java, se

utiliza la clase Socket.

Teóricamente hay 65535 puertos disponibles, aunque los puertos del 1 al

1023 están reservados al uso de servicios estándar proporcionados por el

sistema, quedando el resto libre para utilización por las aplicaciones de

usuario. De no existir los puertos, solamente se podría ofrecer un servicio

por máquina. Nótese que el protocolo IP no sabe nada al respecto de los

números de puerto.

Java advanced programming

URL (Uniform Resource Locator)

Una URL, o dirección, es en realidad un puntero a un determinado recurso. Al

especificar una URL, se está indicando:

- El protocolo utilizado para acceder al servidor (HTTP, por ejemplo)

- El nombre del servidor

- El puerto de conexión (Opcional)

- El path al recurso

- El nombre de un archivo determinado (Opcional a veces)

- Un punto de referencia dentro del archivo (Opcional)

La sintaxis general, para una dirección URL, sería:

protocolo://nombre_servidor[:puerto]/directorio/archivo#referencia

Java advanced programming

Puertos Well-Known

Java advanced programming

ServerSocket

Esta clase es la encargada de definir un puerto de escucha y actuar de

servidor, iniciamos el ServerSocket en un puerto y nos quedamos aceptando

peticiones.

Java advanced programming

Socket

Cuando implementamos el lado Cliente debemos usar un socket e indicarle a

donde nos vamos a conectar.

Java advanced programming

Entrada/Salida

La API de Java diferencia entre los streams de caracteres y streams de bytes.

Streams de bytes (InputStream y OutputStream)

- Diseñados para operar a nivel de byte.

- Hay ciertos dispositivos que sólo pueden trabajar a este nivel.

Streams de caracteres (Reader y Writer)

- Diseñados para optimizar las operaciones con cadenas de caracteres.

- Posteriores a las anteriores.

- Soportan codificaciones Unicode-16.

- Cualquier fichero de texto puede ser accedido directamente a través de este tipo de

stream.

- Existen dispositivos, que aunque están preparados para enviar/recibir información

de esta naturaleza, no pueden tratarse directamente con este stream. En estos

casos, se deberá envolver el stream de bytes con un stream de caracteres.

- InputStreamReader

- OutputStreamReader Java advanced programming

Stream de entradas

Java advanced programming

Stream de salidas

Java advanced programming

Jerarquia de flujos de bytes

Java advanced programming

Jerarquia de flujos de caracteres

Java advanced programming

Java advanced programming

Errores tipicos Intentar usar un puerto que esta siendo usado por otra aplicación

- Obtendremos la exception " java.net.BindException: Address already in use:

connect "

Si dejamos el stream abierto y seguimos creando streams en algún

momento obtenemos el siguiente error.

- No buffer space available (maximum connections reached?):