Introducción al API sockets con java

Download Report

Transcript Introducción al API sockets con java

Introducción al API sockets
con java
Andrés Marín L.
[email protected]
Junio de 2011
Universidad de Antioquia
Ingeniería de Sistemas
Qué es un API
• API significa: Aplication Program Interface
• Sockets: Es el API por excelencia para el
desarrollo de aplicaciones bajo la
arquitectura TCP/IP
• Sockets fueron inventados en Berkeley
bajo el Unix BSD que combinados con
Internet, se extendieron rápidamente a
nivel mundial.
Qué es un socket?
• Un socket es una “manija” a través de la
cual hacemos referencia a una instancia
de comunicaciones.
• Siempre que necesitemos enviar o recibir
datos lo haremos mediante un socket.
• El API socket provee una serie de
llamadas al sistema que permiten asociar
un socket a una conexión.
Qué tipos de aplicaciones se
pueden hacer con el API socket?
• Se pueden desarrollar aplicaciones que
usen los protocolos TCP, UDP e IP.
Igualmente se puede trabajar
directamente sobre la interface de red.
Aspectos generales
• La filosofía de las aplicaciones bajo tcp/ip
es el trabajo Cliente-Servidor.
• Usualmente el servidor es un proceso que
esta “escuchando” un puerto, mediante un
socket, esperando los requerimientos de
los clientes.
• Un cliente es un proceso que envía
requerimientos a un puerto de un servidor
conectado en una red basada en TCP/IP
Aplicaciones UDP
• El protocolo UDP es no orientado a
conexión, por lo tanto, no se requiere
hacer un procedimiento especial de
conexión o cierre de la misma.
• Se requiere importar estas librerías:
import java.net.*;
import java.io.*;
Esquema del servidor
• Declarar un socket
DatagramSocket socket;
• Definir el puerto por el que se reciben las
conexiones y asociar el socket.
static final int serverPort = 6666;
socket = new DatagramSocket(serverPort);
Esquema del servidor
• Definir un buffer de recepción de paquetes
(datagramas UDP)
DatagramPacket packet;
packet = new DatagramPacket(data,packetSize);
• Loop esperando y leyendo datos.
for(;;){
socket.receive(packet);
…. Otras acciones dependiendo del servicio
Esquema del cliente
• Definir un buffer de envio de paquetes
(datagramas UDP) y asociarlo a un puerto
DatagramPacket packet;
packet = new
DatagramPacket(data,data.length,address,serverPort);
• Preparando la información.
data = new byte[packetSize];
messageSend = new String(args[1]);
messageSend.getBytes(0,messageSend.length(),data,0);
Esquema del cliente
• Intercambio de información.
socket.send(packet);
socket.receive(packet);
Aplicaciones TCP
• El protocolo TCP es orientado a conexión,
por lo tanto, se requiere hacer un
procedimiento especial de conexión y
cierre de la misma.
• Se requiere importar estas librerías:
import java.net.*;
import java.io.*;
Esquema del servidor
• Declaramos un socket servidor y lo
asociamos a un puerto
ServerSocket serverSocket = null;
serverSocket = new ServerSocket(4444);
• Esperamos a un cliente que se desee
conectar con el servidor
Socket clientSocket = null;
clientSocket = serverSocket.accept();
• Intercambio de información
– Declaración de un buffer de lectura del canal
BufferedReader entrada = new BufferedReader(
new
InputStreamReader(clientSocket.getInputStream()));
– Declaracción de un buffer de escritura sobre el
canal
PrintWriter salida =
new
PrintWriter(clientSocket.getOutputStream(), true);
– Escribir al canal
String linea = "Dialogue client/server";
salida.println(linea);
– Leer del canal
while ((linea = entrada.readLine()) != null)
salida.println("(Server) You said: " + linea);
Esquema del cliente
• Declaramos un socket que usará el cliente para
la conexión
Socket echoSocket = null;
• Asociamos el socket a un puerto y dirección ip
remota del servidor. Puede ser necesario
convertir un nombre de maquina a dirección IP.
Consultar métodos de InetAddress
getLocalHost, getByAddress, getByName, etc
InetAddress direccion;
direccion = InetAddress.getLocalHost();
echoSocket = new Socket(direccion, 4444);
Esquema del cliente
•
Intercambio de información
– Declaramos un buffer de salida y otro de
entrada
PrintWriter salida = null;
BufferedReader entrada = null;
salida =
new
PrintWriter(echoSocket.getOutputStream(), true);
entrada = new BufferedReader(new
InputStreamReader(echoSocket.getInputStream()));
– Se hacen lecturas
fromServer = entrada.readLine()
– Se hacen escrituras
salida.println(fromUser)
• Cierre de la conexión
salida.close();
entrada.close();
stdIn.close();
echoSocket.close();
• Es posible atender a varios clientes desde
un mismo servidor mediante el uso de
hilos.