6.4 Sockets

Los sockets son un mecanismo que nos permite establecer un enlace entre dos programas que se ejecutan independientes el uno del otro (generalmente un programa cliente y un programa servidor). Java, por medio de la librería java.net, nos provee dos clases: Socket para implementar la conexión desde el lado del cliente y ServerSocket que nos permitirá manipular la conexión desde el lado del servidor.

Cabe resaltar que tanto el cliente como el servidor no necesariamente deben estar implementados en Java, solo deben conocer sus direcciones IP y el puerto por el cual se comunicarán.

ClientSocket
Ejemplo

Para nuestro ejemplo de sockets implementaremos ambos (cliente y servidor) usando Java y se comunicarán usando el puerto 10000 (elegir puertos en el rango de 1024 hasta 65535).

La secuencia de eventos en nuestro ejemplo será:

  1. El servidor creará el socket y esperará a que el cliente se conecte o lo detengamos.
  2. Por otro lado, el cliente abrirá la conexión con el servidor y le enviará una frase en minúsculas que escribirá el usuario y la enviará al servidor.
  3. Una vez recibida la frase en minúsculas, el servidor la convertirá en mayúsculas y la devolverá al cliente.
  4. El cliente mostrará la frase en mayúsculas recibida desde el servidor y cerrará la conexión.
  5. El servidor quedará a la espera de una nueva conexión de otro cliente.
package UT06.P4_Sockets;

import java.io.*;
import java.net.*;

public class TCPServidor {

  public static void main(String[] args) throws IOException, ClassNotFoundException {
    String FraseClient;
    String FraseMajuscules;
    ServerSocket serverSocket = new ServerSocket(10000);
    Socket clientSocket;
    ObjectInputStream entrada;
    ObjectOutputStream eixida;

    System.out.println("Servidor iniciado y escuchando por el puerto 10000");
    while (true) {
        clientSocket = serverSocket.accept();
        entrada = new ObjectInputStream(clientSocket.getInputStream());
        FraseClient = (String) entrada.readObject();

        System.out.println("La frase recibida es: " + FraseClient);

        eixida = new ObjectOutputStream(clientSocket.getOutputStream());
        FraseMajuscules = FraseClient.toUpperCase();
        System.out.println("El servidor devuelve la frase: " + FraseMajuscules);
        eixida.writeObject(FraseMajuscules);

        clientSocket.close();
        System.out.println("Server esperando una nueva conexión...");
    }
  }
}
package UT06.P4_Sockets;

import java.io.*;
import java.net.*;
import java.util.Scanner;

public class TCPClient {

  public static void main(String[] args) throws IOException, ClassNotFoundException {
    Socket socket;
    ObjectInputStream entrada;
    ObjectOutputStream eixida;
    String frase;

    socket = new Socket(InetAddress.getLocalHost(), 10000);
    eixida = new ObjectOutputStream(socket.getOutputStream());

    System.out.println("Introduce la frase a enviar en minúsculas");
    Scanner in = new Scanner(System.in);
    frase = in.nextLine();
    System.out.println("Se envia la frase " + frase);
    eixida.writeObject(frase);

    entrada = new ObjectInputStream(socket.getInputStream());
    System.out.println(
            "La frase recibida es: " + (String) entrada.readObject());

    socket.close();
  }
}