Conexión por Socket Cliente-Servidor

Uno de los métodos usados para realizar una conexión TCP es utilizando Sockets.
¿Pero… a qué nos referimos con Sockets?
Son hilos iniciados por el programa “cliente” para conectar con el programa “servidor” que se encuentra escuchando para iniciar la comunicación entre ambos, esta comunicación puede ser cifrada o no.
Después de esta breve introducción pasaremos a realizar un servidor y cliente para realizar una conexión entre ambos, para ilustrar el funcionamiento de los Sockets.
En primer lugar generaremos el programa “Servidor”, lo haremos en Java.
package javaserversocket;
/*
*Importamos las librerías necesarias
*para realizar nuestro programa servidor
*/
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
/*
* @author Adrián Gómez Fernández
*/

public class JavaServerSocket {    
   /*
    *Declaramos las variables que usaremos    
    *para el programa    
    */    
   private static int port;    
   private static ServerSocket serversocket;    
   private static Socket socket;    
   private static BufferedReader bufferedreader;    
   private static PrintWriter printwriter;    
   private static String out;     
   
   public static void main(String[] args) {       
      try {           
      /*           
       *Iniciamos las variables para            
       *evitar valores nulos           
       */           
       port = 1800;         
       serversocket = new ServerSocket(port);           
       socket = new Socket();           
       socket = serversocket.accept();          
       /*           
        *Este "if" controla que el usuario            
        *se encuentre conectado para empezar            
        *el envío de datos al Cliente            
        */           
       if (socket.isConnected()) {               
       //Cargamos el lector y el escritor 
       bufferedreader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
       printwriter = new PrintWriter(socket.getOutputStream());               
       //Escribimos en el socket              
       printwriter.println("Bienvenido Cliente");               
       //Cerramos el envío               
       printwriter.flush();           
       } else {               
       System.out.println("No hay cliente");           
       }           
       //Leemos el socket           
       while (true) {               
       out = bufferedreader.readLine();               
       System.out.println("Cliente: " + out);               
       //Reenviamos lo que nos envía el cliente               
       printwriter.println(out);              
       printwriter.flush();           
       }       
       //Controlamos la recogida de errores       
       } catch (IOException e) {           
       System.err.println(e.getMessage());       
       }    
    }
}
El servidor que hemos generado es un servidor eco, eso quiere decir que todo mensaje que reciba lo devolverá de la misma manera que lo recibe.
Y ahora generaremos el código para el programa “Cliente”, lo haremos en Java
package javaclientsocket;
/*
*Importamos las librerías necesarias
*para realizar nuestro programa servidor
*/
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Scanner;
/*
*
*
* @author Adrián Gómez Fernández
*/
public class JavaClientSocket { 
/*
*Declaramos las variables que usaremos
*para el programa
*/
  private static Socket socket;
  private static BufferedReader bufferedreader;
  private static PrintWriter printwriter;
  private static String out;
  private static String serverAddress;
  private static int port;
  private static boolean running = true;
  public static void main(String[] args) {
    /*
     *Iniciamos las variables para
     *evitar valores nulos
     */
   serverAddress = "localhost";
   port = 1800;
   try {          
   //Configuramos y lanzamos la conexión al servidor
   InetAddress address = InetAddress.getByName(serverAddress);
   socket = new Socket(address, port);           
   //Preparamos el lector y escritor,
   //también declaramos un "Scanner" para
   //leer la consola.
   bufferedreader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
   printwriter = new PrintWriter(socket.getOutputStream()); 
   out = new String();           
   Scanner scanner = new Scanner(System.in);    
   //Iniciamos un bucle infinito para   
   //que la comunicación sea duradera
   while (running) {     
   printwriter.println(scanner.nextLine()); 
   printwriter.flush();   
   if ((out = bufferedreader.readLine()) != null) {                   
   System.out.println("Server: " + out);   
   if (out.equals("close")) {     
   //si recibimos un “close” se cierra la conexiónsocket.close();  
   running = false;     
   }      
   }   
   }  
   } catch (IOException e) { 
   System.err.println(e.getMessage());    
   } 
   }
}
En la siguiente imagen vemos el diálogo con el servidor:
outputSocketClient
La comunicación se realiza y podemos hablar con nuestro cliente, si quisiéramos que estos datos no pudieran ser interceptados les introduciríamos un cifrado para que no fueran legibles, pero esta cuestión ya se tratará más adelante.
Adrián Gómez
Enterprise Consulting & Training

Share