Programación de sockets en Java

Este artículo describe una configuración de servidor y cliente unidireccional muy básica en la que un cliente se conecta, envía mensajes al servidor y el servidor los muestra mediante una conexión de socket. Hay muchas cosas de bajo nivel que deben suceder para que estas cosas funcionen, pero el paquete de redes API de Java (java.net) se encarga de todo eso, haciendo que la programación de redes sea muy fácil para los programadores.

Programación del lado del cliente

Establecer una conexión de socket 

Para conectarnos a otra máquina necesitamos una conexión de enchufe. Una conexión de socket significa que las dos máquinas tienen información sobre la ubicación de la red (dirección IP) y el puerto TCP de la otra. La clase java.net.Socket representa un Socket. Para abrir un socket: 

Socket socket = new Socket(“127.0.0.1”, 5000)
  • El primer argumento:  dirección IP del servidor . (127.0.0.1 es la dirección IP de localhost, donde el código se ejecutará en la única máquina independiente).
  • El segundo argumento –  Puerto TCP . (Solo un número que representa qué aplicación ejecutar en un servidor. Por ejemplo, HTTP se ejecuta en el puerto 80. El número de puerto puede ser de 0 a 65535)

Comunicación 
Para comunicarse a través de una conexión de socket, los flujos se utilizan tanto para la entrada como para la salida de los datos. 

Cerrar la conexión

La conexión de socket se cierra explícitamente una vez que se envía el mensaje al servidor.

En el programa, el Cliente sigue leyendo la entrada de un usuario y la envía al servidor hasta que se escribe «Over».

Implementación Java

Java

// A Java program for a Client
import java.net.*;
import java.io.*;
 
public class Client
{
    // initialize socket and input output streams
    private Socket socket            = null;
    private DataInputStream  input   = null;
    private DataOutputStream out     = null;
 
    // constructor to put ip address and port
    public Client(String address, int port)
    {
        // establish a connection
        try
        {
            socket = new Socket(address, port);
            System.out.println("Connected");
 
            // takes input from terminal
            input  = new DataInputStream(System.in);
 
            // sends output to the socket
            out    = new DataOutputStream(socket.getOutputStream());
        }
        catch(UnknownHostException u)
        {
            System.out.println(u);
        }
        catch(IOException i)
        {
            System.out.println(i);
        }
 
        // string to read message from input
        String line = "";
 
        // keep reading until "Over" is input
        while (!line.equals("Over"))
        {
            try
            {
                line = input.readLine();
                out.writeUTF(line);
            }
            catch(IOException i)
            {
                System.out.println(i);
            }
        }
 
        // close the connection
        try
        {
            input.close();
            out.close();
            socket.close();
        }
        catch(IOException i)
        {
            System.out.println(i);
        }
    }
 
    public static void main(String args[])
    {
        Client client = new Client("127.0.0.1", 5000);
    }
}

Programación del servidor

Establecer una conexión de socket

Para escribir una aplicación de servidor se necesitan dos sockets. 

  • Un ServerSocket que espera las requests del cliente (cuando un cliente crea un nuevo Socket())
  • Un socket simple y antiguo para usar en la comunicación con el cliente.

El método de comunicación
getOutputStream() se utiliza para enviar la salida a través del socket.

Cierre la conexión 
Después de terminar, es importante cerrar la conexión cerrando el socket y los flujos de entrada/salida.

Java

// A Java program for a Server
import java.net.*;
import java.io.*;
 
public class Server
{
    //initialize socket and input stream
    private Socket          socket   = null;
    private ServerSocket    server   = null;
    private DataInputStream in       =  null;
 
    // constructor with port
    public Server(int port)
    {
        // starts server and waits for a connection
        try
        {
            server = new ServerSocket(port);
            System.out.println("Server started");
 
            System.out.println("Waiting for a client ...");
 
            socket = server.accept();
            System.out.println("Client accepted");
 
            // takes input from the client socket
            in = new DataInputStream(
                new BufferedInputStream(socket.getInputStream()));
 
            String line = "";
 
            // reads message from client until "Over" is sent
            while (!line.equals("Over"))
            {
                try
                {
                    line = in.readUTF();
                    System.out.println(line);
 
                }
                catch(IOException i)
                {
                    System.out.println(i);
                }
            }
            System.out.println("Closing connection");
 
            // close connection
            socket.close();
            in.close();
        }
        catch(IOException i)
        {
            System.out.println(i);
        }
    }
 
    public static void main(String args[])
    {
        Server server = new Server(5000);
    }
}

Puntos importantes 

  • La aplicación del servidor crea un ServerSocket en un puerto específico que es el 5000. Esto hace que nuestro servidor escuche las requests de los clientes que ingresan al puerto 5000.
  • Luego, el servidor crea un nuevo socket para comunicarse con el cliente.
socket = server.accept()
  • El método accept() bloquea (simplemente se sienta allí) hasta que un cliente se conecta al servidor.
  • Luego tomamos la entrada del socket usando el método getInputStream(). Nuestro Servidor sigue recibiendo mensajes hasta que el Cliente envía «Over».
  • Una vez que hayamos terminado, cerramos la conexión cerrando el socket y el flujo de entrada.
  • Para ejecutar la aplicación Cliente y Servidor en su máquina, compile ambas. Luego, primero ejecute la aplicación del servidor y luego ejecute la aplicación del Cliente.

Para ejecutar en Terminal o Símbolo del sistema

Abra dos ventanas una para Servidor y otra para Cliente

1. Primero ejecute la aplicación del servidor como,  

$ java Server

El servidor comenzó 
Esperando un cliente…

2. Luego ejecute la aplicación Cliente en otro terminal como,  

$ java Client

Mostrará: Conectado y el servidor acepta al cliente y muestra,
Cliente aceptado

3. Luego puede comenzar a escribir mensajes en la ventana del Cliente. Aquí hay una entrada de muestra para el cliente  

Hello
I made my first socket connection
Over

que el Servidor recibe y muestra simultáneamente,  

Hello
I made my first socket connection
Over
Closing connection

Tenga en cuenta que enviar «Over» cierra la conexión entre el Cliente y el Servidor como se dijo antes. 

Si está utilizando Eclipse o similares,

  1. Compile ambos en dos terminales o pestañas diferentes
  2. Ejecute primero el programa del servidor
  3. Luego ejecute el programa Cliente
  4. Escriba mensajes en la Ventana del Cliente que serán recibidos y mostrados por la Ventana del Servidor simultáneamente.
  5. Escriba Sobre para terminar.

Este artículo es una contribución de Souradeep Barua . Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo y enviarlo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *