Saltar al contenido
Portada » Sockets en Java

Sockets en Java

Modelo Cliente-Servidor

Vamos a implementar un modelo Cliente-Servidor básico utilizando el API de sockets en Java. Levantaremos una clase servidora y utilizaremos una clase cliente para enviarle información.

Clase abstracta “Conector”

Esta clase implementa un conector general definiendo los puertos y las ips de conexión. A partir de ella implementaremos por herencia las clases del cliente y servidor.

abstract public class Conector
{
    private final int PUERTO = 1234; 
    private final String HOST = "localhost"; 
    
    public static final String CONECTOR_TIPO_SERVIDOR = "servidor";
    public static final String CONECTOR_TIPO_CLIENTE = "cliente";
    
    protected String mensajeServidor; 
    protected ServerSocket serverSocket; 
    protected Socket clientSocket; 
    
    protected DataOutputStream salidaServidor, salidaCliente; 

    public Conector(String tipo) throws IOException 
    {
        if(tipo.equalsIgnoreCase(CONECTOR_TIPO_SERVIDOR))
        {
        	serverSocket = new ServerSocket(PUERTO);
        	clientSocket = new Socket(); 
        }
        else if(tipo.equalsIgnoreCase(CONECTOR_TIPO_CLIENTE))
        {
        	clientSocket = new Socket(HOST, PUERTO); 
        }
    }
}

Clase “Servidor”

Esta clase extiende la clase “Conector”. Implementa el comportamiento de un servidor. Al ejecutarla se mantiene en espera de una conexión de un cliente para recibir datos.

public class Servidor extends Conector
{
    public Servidor() throws IOException
    {
    	super(CONECTOR_TIPO_SERVIDOR);
    } 

    public void startServer()
    {
        try
        {
            System.out.println("...En espera de recibir conexiones...");

            clientSocket = serverSocket.accept(); // En espera de la conexion de un cliente

            System.out.println("Cliente en línea");

            salidaCliente = new DataOutputStream(clientSocket.getOutputStream());

            salidaCliente.writeUTF("Petición recibida y aceptada");

            BufferedReader entrada = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

            while((mensajeServidor = entrada.readLine()) != null) // Recibiendo mensajes del cliente
            {
                System.out.println(mensajeServidor);
            }

            System.out.println("Fin de la conexión");

            serverSocket.close();
        }
        catch (Exception e)
        {
            System.out.println(e.getMessage());
        }
    }
}

Clase “Cliente”

Clase “Cliente” que extiende la clase “Conector”. Establece una conexión con un servidor para enviarle datos.

public class Cliente extends Conector
{
    public Cliente() throws IOException
    {
    	super(CONECTOR_TIPO_CLIENTE);
    } 

    public void startClient() 
    {
        try
        {
            salidaServidor = new DataOutputStream(clientSocket.getOutputStream());

            for (int i = 0; i < 2; i++)
            {
                salidaServidor.writeUTF("Mensaje numero " + (i+1) + "\n");
            }

            clientSocket.close();

        }
        catch (Exception e)
        {
            System.out.println(e.getMessage());
        }
    }
}

Clase Test Servidor

Esta clase sirve para poder “levantar” un servidor.

public class TestServidor 
{
    public static void main(String[] args) throws IOException
    {
        Servidor serv = new Servidor(); 

        System.out.println("Levantando servidor\n");
        
        serv.startServer(); 
    }
}

Clase Test Cliente

Esta clase inicia un cliente. Necesitas lanzar antes la clase “TestServidor” para que el cliente tenga a donde conectarse.

public class TestCliente 
{
    public static void main(String[] args) throws IOException
    {
        Cliente cli = new Cliente(); 

        System.out.println("Iniciando cliente\n");
        
        cli.startClient(); 
    }
}

Más algoritmos de redes

TemaDescripción
SocketsAprende lo básico sobre sockets en Java, construye tus protocolos.
WebsocketsConstruye un endpoint en Java al que conectar mediante Websockets.
FTPCódigo para implementar en Java un cliente FTP
IMAPCliente IMAP escrito en Java.
SMB/jCIFSUso de jCIFS para el acceso a recursos de red compartidos mediante SAMBA
Send Mail JavaEnvío de correos electrónicos a través de JavaMail API

Recursos básicos Java

AsuntoDescripción
Tutorial básico y sintaxisTutorial básico Java y sintaxis. Aprende los fundamentos del lenguaje.
Hilos (Threads)Aprende a manejar hilos y las cuestiones básicas de la concurrencia
Funciones LambdaAquí te enseñamos las nociones más importantes para arrancas con funciones lambda
PalíndromosPrograma de ejemplo para el uso de palíndromos en Java.
Máquina Virtual de JavaTe explicamos el funcionamiento de la máquina virtual de java (Java Virtual Machine – JVM)
JDK, JRE y JVMDiferencias entre el JDK, JRE y JVM.
Mejores libros Java en EspañolHazte con los mejores libros Java para aprender paso a paso y profundizar en las mejores prácticas
TensorFlowManejo del API de TensorFlow para la construcción de grafos de operaciones y su ejecución
Tutorial Log4jTutorial para el manejo de Log4j, herramienta ágil y flexible para la gestión de Logs en Java
Java SecurityEntiende y aplica las posibilidades que da Java para mantener la seguridad
Tutorial JConsoleAprende los conceptos básicos de monitorización de procesos Java con JConsole
JavaFXTutorial de JavaFX, librería gráfica moderna para construcción de GUIs en móvil, escritorio y web.
Estructuras de datos en JavaExplicación y ejemplos de las estructuras de datos más importantes: listas, pila, cola, arbol.
JavaapiConjunto de clases, interfaces, métodos y paquetes que forman parte de la plataforma Java estándar
Algoritmo HuffmanMétodo eficiente para codificar datos, asignando códigos más cortos a los caracteres más frecuentes