Sigueme en Facebook Sigueme en Twitter Sigueme en Instagram Sigueme en Youtube
JC Mouse Bolivia
Index / Proyectos / Ejemplo socket java Cliente/Servidor

Ejemplo socket java Cliente/Servidor

Autor jc mouse miércoles, agosto 24, 2016

En este post construiremos un sencillo sistema Cliente/Servidor en lenguaje Java, el sistema consistirá básicamente en un Servidor que se pondrá a la escucha en un puerto «X» de un Cliente el cual mandara peticiones a los cuales el servidor responderá después de su procesamiento.

server bolivia

Necesitamos:

  • IDE Netbeans 8.x
  • IDE Eclipse
  • Java 7 o sup

Tiempo: 30 minutos

Nivel: Intermedio

El Servidor

El servidor es el encargado de responder las peticiones de los clientes previo proceso de las mismas. Un servidor puede atender peticiones de varios clientes. En este ejemplo solo atenderá a un cliente, es recomendable el uso de Thread para sistemas multi-clientes, pero eso lo veremos en otro tutorial.

Realizaremos la aplicación servidor en Netbeans.

Paso 1. Crea un nuevo proyecto con la siguiente estructura de clases y paquetes

servidor

Paso 2. Código

Como ya mencionamos más arriba nuestro servidor estará a la escucha de una conexión en el puerto 5000. Cuando reciba una petición procesara esta y retornara el resultado

  • libro: Retorna un libro más autor aleatoriamente
  • frase: Retornara una frase aleatoria
  • exit: retorna mensaje de despedida pero el servidor continuara a la escucha en el puerto 5000

El método encargado de procesar las peticiones de los clientes es el método «process«. A continuación el código completo del servidor comentado linea a linea

package server;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Collections;
/**
 * @see https://www.jc-mouse.net/
 * @author mouse
 */
public class MainServer {

    /**
     * Puerto 
     */
    private final static int PORT = 5000;
    
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        
        try {
            //Socket de servidor para esperar peticiones de la red
            ServerSocket serverSocket = new ServerSocket(PORT);
            System.out.println("Servidor> Servidor iniciado");    
            System.out.println("Servidor> En espera de cliente...");    
            //Socket de cliente
            Socket clientSocket;
            while(true){
                //en espera de conexion, si existe la acepta
                clientSocket = serverSocket.accept();
                //Para leer lo que envie el cliente
                BufferedReader input = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
                //para imprimir datos de salida                
                PrintStream output = new PrintStream(clientSocket.getOutputStream());
                //se lee peticion del cliente
                String request = input.readLine();
                System.out.println("Cliente> petición [" + request +  "]");
                //se procesa la peticion y se espera resultado
                String strOutput = process(request);                
                //Se imprime en consola "servidor"
                System.out.println("Servidor> Resultado de petición");                    
                System.out.println("Servidor> \"" + strOutput + "\"");
                //se imprime en cliente
                output.flush();//vacia contenido
                output.println(strOutput);                
                //cierra conexion
                clientSocket.close();
            }    
        } catch (IOException ex) {
            System.err.println(ex.getMessage());
        }
    }
    
    /**
     * procesa peticion del cliente y retorna resultado
     * @param request peticion del cliente
     * @return String
     */
    public static String process(String request){
        String result="";        
        //frases
        String[] phrases = {
            "La tecnología se alimenta a si misma. La tecnología hace posible más tecnología.-Alvin Toffler.",
            "La tecnología es sólo una herramienta. En términos de llevar a los niños a trabajar juntos y motivarlos, el profesor es el más importante.-Bill Gates.",
            "La máquina tecnológicamente más eficiente que el hombre ha inventado es el libro.-Northrop Frye.",
            "Ya no hacen más los bugs como bunny - Olav Mjelde",
            "Un lenguaje de programación es de bajo nivel cuando requiere que prestes atencion a lo irrelevante.-Alan J. Perlis.",
            "Hablar es barato. Enséñame el código.-Linus Torvalds ",
            "No me importa si funciona en su máquina! No me envían su máquina!.-Vidiu Platon",
            "Siempre codifica como si la persona que finalmente mantendrá tu código fuera un psicópata violento que sabe dónde vives.-Martin Golding"};
	ArrayList<String> phrasesList = new ArrayList<>();
	Collections.addAll(phrasesList, phrases);
        //libros
        String[] books = {
            "Divina Comedia - Dante Alighieri", 
            "Don Quijote de la Mancha - Miguel de Cervantes",
            "Cien años de soledad - Gabriel García Márquez",
            "Moby Dick - Herman Melville",
            "Ana Karenina - Lev Tolstói",
            "Eneida - Virgilio",
            "Otelo - William Shakespeare",
            "El viejo y el mar - Ernest Hemingway",
            "Orgullo y prejuicio - Jane Austen"};
	ArrayList<String> booksList = new ArrayList<>();
	Collections.addAll(booksList, books);        
        
        if(request!=null) switch(request){
            case "frase":
                Collections.shuffle(phrasesList);
                result = phrasesList.get(0);
                break;
            case "libro":
                Collections.shuffle(booksList);
                result = booksList.get(0);
                break;
            case "exit":                
                result = "bye";
                break;
            default:
                result = "La peticion no se puede resolver.";
                break;
        }
        return result;
    }
    
}

El Cliente

Para el cliente utilizaremos el IDE Eclipse, existen varias versiones de este IDE, puedes utilizar cualquiera de ellos, nosotros emplearemos Eclipse Mars 1.

Paso 1. Crea un proyecto nuevo con la siguiente estructura:

cliente java

Paso 2. El Código del Cliente

El código del cliente es más sencillo que el del servidor. La diferencia esta que ademas de indicar el puerto de conexión, debemos indicar el Host. El código del cliente mas comentarios linea a linea es el siguiente:

package cliente;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;

public class MainCliente {
	
    /**
    * Puerto
    * */
    private final static int PORT = 5001;
    /**
    * Host
    * */
    private final static String SERVER = "localhost";
    
    public static void main(String[] args) {
    	boolean exit=false;//bandera para controlar ciclo del programa
        Socket socket;//Socket para la comunicacion cliente servidor        
        try {            
            System.out.println("Cliente> Inicio");  
            while( !exit ){//ciclo repetitivo                                
                socket = new Socket(SERVER, PORT);//abre socket                
                //Para leer lo que envie el servidor      
                BufferedReader input = new BufferedReader( new InputStreamReader(socket.getInputStream()));                
                //para imprimir datos del servidor
                PrintStream output = new PrintStream(socket.getOutputStream());                
                //Para leer lo que escriba el usuario            
                BufferedReader brRequest = new BufferedReader(new InputStreamReader(System.in));            
                System.out.println("Cliente> Escriba comando");                
                //captura comando escrito por el usuario
                String request = brRequest.readLine();                
                //manda peticion al servidor
                output.println(request); 
                //captura respuesta e imprime
                String st = input.readLine();
                if( st != null ) System.out.println("Servidor> " + st );    
                if(request.equals("exit")){//terminar aplicacion
                    exit=true;                  
                    System.out.println("Cliente> Fin de programa");    
                }  
                socket.close();
            }//end while                                    
       } catch (IOException ex) {        
         System.err.println("Cliente> " + ex.getMessage());   
       }
    }
    
}

Ejecución del Sistema Cliente/Servidor

Lo primero que se debe ejecutar es el Servidor, ya que si ejecutamos el Cliente primero y no hay un Servidor escuchando, obviamente tendremos un error de conexión. Pero con un video tendremos más claro su funcionamiento.

enjoy!!!

Tags

Si te ha gustado podrías compartirlo o dejar un comentario. ¡Muchas gracias!
Autor: JC Mouse

Yo soy yo :) JC Mouse, Soy orgullosamente boliviano soy fundador y CEO de la web jc-Mouse.net uno de las pocas web en emprendimiento y tecnología en Bolivia.

Toda la información que encuentres en este sitio es y sera completamente gratis siempre, puedes copiar, descargar y re-publicar si así lo deseas en otros blogs o sitios web, solo te pido a cambio que dejes una referencia a esta web. Esto nos ayuda a crecer y seguir aportando. Bye

Enjoy! :)

También Te Podría Interesar

JToggleButton y base de datos

JToggleButton y base de datos

En este tutorial veremos una forma de trabajar con el swing  JToggleButton y una base de datos para dar respuesta a una...

Pilas con C Sharp (Ejercicio Resuelto)

Pilas con C Sharp (Ejercicio Resuelto)

Desarrolle un programa en consola con un menú para el usuario que permita agregar elementos a una pila, eliminar element...

Matriz de Adyacencia: Representación de grafos en Java

Matriz de Adyacencia: Representación de grafos en Java

En este post conoceremos una forma de representar grafos mediante una Matriz de Adyacencia y un ejemplo básico de este e...

Guardar y Leer imagenes en PostgresSQL

Guardar y Leer imagenes en PostgresSQL

En este tutorial veremos una forma para registrar archivos JPG en una base de datos PostgreSQL y recuperarlos para utili...

Crea tu propia plantilla de proyectos

Crea tu propia plantilla de proyectos

En un post anterior [Crear plantillas personalizadas para Netbeans] vimos una forma sencilla que tiene Netbeans para fac...

Juego: Adivina el número

Juego: Adivina el número

Problema: Desarrollar un juego en consola con Kotlin que genere un numero aleatorio entre un rango preestablecido y perm...

9 comentarios en “Ejemplo socket java Cliente/Servidor”

  1. fernando dice:

    excelente, agradeceria mucho julio cesar, si podrias mostrar un ejm con base de datos y multi_cliente.

    1. fernando dice:

      usando ip dinamica

  2. dark dice:

    ammmmmmmmmmmm…. porque usas dos IDE’s para el proyecto? simple duda :/

    1. Mouse dice:

      porque muchos se aferran a un solo IDE cuando en esencia son lo mismo, y para que se puedan ver al mismo tiempo el cliente y el servidor 🙂

      1. dark dice:

        pues por esa parte lo entiendo aunque no se… hahahaha algunos apenas empiezan y al ver algo así se limitaran otros aprenderán un poco mas igual ando manejando varios IDE, aunque ahorita estoy pensando comprar seriamente el visual studio. por cierto en el ámbito de los juegos no le has metido mano seria genial yo hice uno de ejemplo pero con GameMaker intentare uno bajo java o C# igual son buenas practicas.

  3. RENATO dice:

    Muchas gracias por tu aporte

  4. Mario dice:

    Hola, interesante ahora como hago para leer un archivo con una ip que me servirá para conectarme al servidor, esa ip es personalizable por esa razon se necesita leer de un archivo externo, se que se haria con las clases reader pero tengo problemas al momento de concatenar. Tengo esto por ahora:
    public static String muestraContenido(String archivo) throws FileNotFoundException, IOException {

    FileInputStream f = new FileInputStream(archivo);
    BufferedReader b = new BufferedReader(new InputStreamReader(f));
    String cadena;
    while ((cadena = b.readLine()) != null) {
    return cadena;
    }
    b.close();
    return cadena;
    }

    Y esta es mi clase conexion
    public static Connection conectar() {

    try {
    if (con == null) {
    String ip=muestraContenido(«C:\\conex_sicore.ini»);
    System.out.println(ip);
    String ser = «192.168.0.17»
    String db = «remi»;
    //Si ejecuta sin concatenar
    //String url = «jdbc:mysql://192.168.0.3:3306/» + db;
    //No ejecuta al concatenar
    String url = «jdbc:mysql://»+ser+»:3306/»+db;
    System.out.println(«ruta «+url);
    String user = «soto»;
    String password = «sotmax12»;

    Class.forName(«com.mysql.jdbc.Driver»);
    con = DriverManager.getConnection(String.valueOf(url), user, password);
    System.out.println(«conexion establecida con la bd » + db);
    }
    } catch (ClassNotFoundException c) {
    System.out.println(«Error de libreria » + c);
    } catch (SQLException e) {
    System.out.println(«Error al establecer conexion con el servidor » + e.getMessage());
    if (e.getMessage().equalsIgnoreCase(«The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.»)) {
    JOptionPane.showMessageDialog(null, «No se han iniciado los servios mysql en el servidor\nContacte con el administrador de TI para solucionar este problema»);
    return null;
    }

    //The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
    } catch (IOException ex) {
    ex.printStackTrace();
    }
    return con;
    }
    Ese es el problema no se si habra otra forma de hacerlo mejor, alguna idea. Gracias.

  5. ruben dice:

    El Código del Cliente podrías ser en javascript? o con javascript solo se puede llamar a un web socket?
    saludos.

    1. Mouse dice:

      Si se puede

Los comentarios estan cerrados

Comparte lo que sabes

Categorias

Últimas entradas

Por lo general se usan transacciones a nivel base de datos y posteriormente se llaman estos a través de procedimientos a...

En este post, aprenderemos como conectar Visual Basic 6 con SQL Server, abrir una tabla, leer su contenido y mostrar est...

Lo que veremos en este post es la configuración del driver para PHP de SQL Server que ha creado Microsoft el cual permit...

Google Bard la inteligencia artificial de Google se actualiza con una mejora que entra a competir con el resto de IAs y...

Herramientas

Generador de Enlaces a Whatsapp