introducción al api sockets con java andrés marín l. [email protected] junio de 2011 universidad...
TRANSCRIPT
Introducción al API sockets con javaAndrés Marín L.
[email protected] de 2011
Universidad de AntioquiaIngenierí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 socketDatagramSocket 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 canalString linea = "Dialogue client/server";
salida.println(linea);
– Leer del canalwhile ((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
entradaPrintWriter salida = null;BufferedReader entrada = null;salida = new
PrintWriter(echoSocket.getOutputStream(), true);entrada = new BufferedReader(new
InputStreamReader(echoSocket.getInputStream()));
– Se hacen lecturasfromServer = entrada.readLine()
– Se hacen escriturassalida.println(fromUser)
• Cierre de la conexiónsalida.close();
entrada.close();
stdIn.close();
echoSocket.close();
• Es posible atender a varios clientes desde un mismo servidor mediante el uso de hilos.