Funcionamiento de los Sockets en Java.

1

Objetivos

               ● Conocer el concepto de socket y el motivo de su utilización

               ● Conocer la arquitectura cliente servidor desde el punto de vista de los sockets

               ● Conocer las clases Java relacionadas con el uso de socketsProgramación de Servicios y Procesos

               ● Introducción

              ● Definición de socket

              ● Funcionamiento de los sockets

              ● Modelo de comunicación Sockets Java (Arq. Cliente Servidor)

              ● Apertura y cierre de Sockets

              ● Clases Java a utilizar

              ● Ejemplos de utilización

              ● Bibliografía

Definicion de Sockets

Los sockets son formas en las que podemos interconectar 2 (o mas) programas mediante el uso de internet. En java se utilizan para poder crear conexiones utilizando basicamente una IP/hostname y un puerto para establecer la conexión. Para aprender podemos utilizarla para conenctar 2 programas por medio de Internet.

Funcionamiento de los sockets

Consta de de 2 programas :

  1. Servidor :Un servidor y un clienteBasicamente el programa servidor comienza a “escuchar” en un puerto determinado(nosotros lo especificamos) .
  2. El cliente debe saber la ip o el nombre de domino del servidor y el puerto que esta escuchando ,al saber esto simplemente solicita establecer una conexión con el servidor. Es aqui cuando el servidor acepta esa conexión y se puede decir que estos programas estan “conectados”, de este modo pueden intercambiar información. En el siguiente video muestro un programa servidor con sockets, explico mas o menos el codigo, en que consiste y hago una prueba en el cual la conexión es exitosa.

Modelo de comunicación Sockets Java (Arq. Cliente Servidor).

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

proporcionan comunicación de red independiente del sistema.

A través de las clases del paquete java.net, los programas Java pueden utilizar TCP o UDP

para comunicarse a través de Internet. Las clases URL, URLConnection, Socket, y

SocketServer utilizan TCP para comunicarse a través de la Red. Las clases

DatagramPacket y DatagramServer 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

ServerSocket 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.

Apertura y cierre de Sockets

Es el más simple, lo único que se hace es enviar los datos, mediante la creación de un socket y

utilizando los métodos de envío y recepción apropiados.

Se trata de 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 UDP, 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.

public class java.net.DatagramSocket extends java.lang.Object

A) Constructores :

public DatagramSocket () throws SocketException

Se encarga de construir un socket para datagramas y de conectarlo al primer puerto disponible.

public DatagramSocket (int port) throws SocketException

Ídem, pero con la salvedad de que permite especificar el número de puerto asociado.

public DatagramSocket (int port, InetAddress ip) throws SocketException

Permite especificar, además del puerto, la dirección local a la que se va a asociar el socket.

B) Métodos :

public void close()

Cierra el socket.

protected void finalize()

Asegura el cierre del socket si no existen más referencias al mismo.

public int getLocalPort()

Retorna el número de puerto en el host local al que está conectado el socket.

public void receive (DatagramPacket p) throws IOException

Recibe un DatagramPacket del socket, y llena el búfer con los datos que recibe.

public void send (DatagramPacket p) throws IOException

Envía un DatagramPacket a través del socket.

Clases Java a utilizar

Así el paquete java.net proporciona, entre otras, las siguientes clases, que son las que se

verán con detalle:

– Socket: Implementa un extremo de la conexión TCP.

– ServerSocket: Se encarga de implementar el extremo Servidor de la conexión en la

que se esperarán las conexiones de los clientes.

– DatagramSocket: Implementa tanto el servidor como el cliente cuando se utiliza UDP.

– DatagramPacket: Implementa un datagram packet, que se utiliza para la creación de

servicios de reparto de paquetes sin conexión.

– InetAddress: Se encarga de implementar la dirección IP.

1º) El proceso servidor crea un socket con nombre y espera la
conexión.
2º) El proceso cliente crea un socket sin nombre.
3º) El proceso cliente realiza una petición de conexión al socket
servidor.
4º) El cliente realiza la conexión a través de su socket mientras el
proceso servidor mantiene el socket servidor original con
nombre.

Ejemplos de utilización socket

Hay una clase que es el servidor, que inicia un socket de servidor en el puerto 20000; este socket recibirá peticiones desde el cliente, y las enviará de nuevo al cliente. El socket finaliza cuando recibe “salir” desde el cliente.
El Cliente abre un socket que se conecta al servidor (como lo ejecutaremos en la misma máquina podemos poner localhost) indicado (debemos especificar también el puerto del servidor). En la aplicación podemos introducir texto, y este será enviado al servidor (el cual nos devuelve una respuesta que se imprime por pantalla). Cuando enviamos “salir” se finaliza el socket del servidor, y por tanto dejaremos de recibir mensajes.
Durante la ejecución del servidor podemos ver el proceso servidor en ejecución desde línea de comandos mediante ps -ef|grep 20000

Servidor

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

import java.net.*;

import java.io.*;

public class Servidor {

    public static void main(String[] args) throws IOException {

        ServerSocket serverSocket = null;

        try {

            serverSocket = new ServerSocket(20000);

        } catch (IOException e) {

            System.err.println(“No se puede escuchar en puerto:20000.”);

            System.exit(1);

        }

        Socket clientSocket = null;

        try {

            clientSocket = serverSocket.accept();

        } catch (IOException e) {

            System.err.println(“Falla conexión”);

            System.exit(1);

        }

        PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);

        BufferedReader in = new BufferedReader(

                                new InputStreamReader(

                                clientSocket.getInputStream()));

        String inputLine, outputLine;

        while ((inputLine = in.readLine()) != null) {

             outputLine = inputLine;

             out.println(“devuelvo al cliente: “+outputLine);

             if (outputLine.equals(“salir”))

                break;

        }

        out.close();

        in.close();

        clientSocket.close();

        serverSocket.close();

    }

}

Cliente

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

import java.io.*;

import java.net.*;

public class Cliente {

    public static void main(String[] args) throws IOException {

        Socket echoSocket = null;

        PrintWriter out = null;

        BufferedReader in = null;

        try {

            echoSocket = new Socket(“localhost”, 20000);

            out = new PrintWriter(echoSocket.getOutputStream(), true);

            in = new BufferedReader(new InputStreamReader(echoSocket.getInputStream()));

        } catch (UnknownHostException e) {

            System.err.println(“Host desconocido”);

            System.exit(1);

        } catch (IOException e) {

            System.err.println(“No se puede conectar a localhost”);

            System.exit(1);

        }

        BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));

        String userInput;

        while ((userInput = stdIn.readLine()) != null) {

            out.println(userInput);

            System.out.println(“echo: “ + in.readLine());

        }

        out.close();

        in.close();

        stdIn.close();

        echoSocket.close();

    }

}

 

Anuncios

Publicado el 2 diciembre, 2014 en Programacion de Servicios. Añade a favoritos el enlace permanente. Comentarios desactivados en Funcionamiento de los Sockets en Java..

Los comentarios están cerrados.

A %d blogueros les gusta esto: