Sockets en Java (cliente y servidor)

 

Sockets en Java

(el codigo fuente esta mas abajo…)

Los sockets son basicamente formas en las que podemos interconectar 2 (o mas) programas mediante el uso de la internet. En java se utilizan para poder crear conexiones utilizando basicamente una IP/hostname y un puerto para establecer la conexión. Para aprender podemos utilizarla para conenctar 2 programas por medio de Internet.

¿Como funciona?

El modelo mas basico de los sockets consta de 2 simples programas, un servidor y un cliente. Basicamente el programa servidor comienza a “escuchar” en un puerto determinado(nosotros lo especificamos), y posteriormente el programa que la hace de “cliente” debe conocer la ip o nombre de dominio/hostname del servidor y el puerto que esta escuchando, al saber esto simplemente solicita establecer una conexión con el servidor. Es aqui cuando el servidor acepta esa conexión y se puede decir que estos programas estan “conectados”, de este modo pueden intercambiar información. En el siguiente video muestro un programa servidor con sockets, explico mas o menos el codigo, en que consiste y hago una prueba en el cual la conexión es exitosa.

Video de Sockets en java

Notas:
*Ambos programas (servidor y cliente) no necesitan estar programados en Java, es posible programarlos en lenguajes de programación diferentes, o inclusive programar un servidor en java y utilizar un cliente ya existente que pueda conectarse a un puerto especificado.

*El cliente debe de conocer tanto el puerto a utilizar como la IP o dominio del servidor, mientras el servidor solo debe conocer el puerto de conexión

A continuación les dejo este código de un servidor muy simple que yo hice en Java, lo que hace es escuchar el puerto 5000, cuando un cliente se conecta este envía un mensaje de confirmación al cliente, luego el cliente al enviar su primer mensaje, el servidor envía un segundo mensaje y se cierra la conexión. También el de un cliente muy muy simple solo para que se vea la diferencia, de como se pide la conexión al servidor, el cliente únicamente envía un mensaje de texto pero no recibe información.

Codigo fuente del servidor

 

import java.net.*;

import java.io.*;

/**

*

* @author Jorge V

*/

public class Conex {

final int PUERTO=5000;

ServerSocket sc;

Socket so;

DataOutputStream salida;

String mensajeRecibido;

//SERVIDOR

public void initServer()

{

BufferedReader entrada;

try

{

sc = new ServerSocket(PUERTO );/* crea socket servidor que escuchara en puerto 5000*/

so=new Socket();

System.out.println("Esperando una conexión:");

so = sc.accept();
//Inicia el socket, ahora esta esperando una conexión por parte del cliente

System.out.println("Un cliente se ha conectado.");

//Canales de entrada y salida de datos

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

salida = new DataOutputStream(so.getOutputStream());

System.out.println("Confirmando conexion al cliente....");

salida.writeUTF("Conexión exitosa...n envia un mensaje :D");

//Recepcion de mensaje

mensajeRecibido = entrada.readLine();

System.out.println(mensajeRecibido);

salida.writeUTF("Se recibio tu mensaje.n Terminando conexion...");

salida.writeUTF("Gracias por conectarte, adios!");

System.out.println("Cerrando conexión...");

sc.close();//Aqui se cierra la conexión con el cliente

}catch(Exception e )

{

System.out.println("Error: "+e.getMessage());

}

}

}

 

Codigo fuente cliente simple

 

 

import java.net.*;

import java.io.*;

/**

*

* @author Jorge V

*/

public class Conex {

final String HOST = "localhost";

final int PUERTO=5000;

Socket sc;

DataOutputStream mensaje;

DataInputStream entrada;

//Cliente

public void initClient() /*ejecuta este metodo para correr el cliente */

{

try

{

sc = new Socket( HOST , PUERTO ); /*conectar a un servidor en localhost con puerto 5000*/

//creamos el flujo de datos por el que se enviara un mensaje

mensaje = new DataOutputStream(sc.getOutputStream());

//enviamos el mensaje

mensaje.writeUTF("hola que tal!!");

//cerramos la conexión

sc.close();

}catch(Exception e )

{

System.out.println("Error: "+e.getMessage());

}

}

}

 

Espero que esta pequeña introducción a los sockets haya sido de ayuda, por favor deja tus comentarios{jcomments on}.

 

 

Acerca del autor:

Mi nombre es Jorge Villalobos, soy Colombiano de nacimiento y resido en México desde 2005,actualmente soy el creador de codigoprogramacion.com Soy ingeniero en tecnologías de información y comunicaciones y trabajo de tiempo completo desarrollando aplicaciones web. En general me considero un tipo normal, me gusta salir, divertirme, y uno de mis hobbies es programar y hacer tutoriales para compartir conocimiento, me gusta la pizza, el ajedrez y tomar una que otra cerveza los fines de semana. Espero que este proyecto ayude a ayudar a los demás.

Twitter del autor:

80 comments

  1. Anonymus says:

    El codigo no funciona por favor arreglelo

  2. itzel b says:

    hola quisiera saber como es que unes dos códigos por ejemplo sockets con RSA

  3. datador hp says:

    Tem incrível em favor da me ter um web site , que é
    benéfico projetado para meu sei-como. Obrigado admin

  4. David says:

    Hola, Jorge

    1. Gracias por compartir tus conocimientos
    2. Help. Sabes como puedo hacer el envio de un JSON (JavaScript Object Notation – Notación de Objetos de JavaScript), desde el cliente al servidor?

    Gracias.

  5. Edwin says:

    ME sale error que no se encuentra el “main”

  6. Appreciation to my father who stated to me on the topic of
    this blog, this web site is really awesome.

  7. RE:Sockets en Java (cliente y servidor) | Codigoprogramacion Валок Кузбасс Печоры

  8. Dayana says:

    Gracias por el código fue de bastante ayuda, pero como se puede hacer una conexión de 1 a N? ya sea N Clientes o N Servidores

  9. Carlos says:

    una duda, como podria usar esto, pero para compartir archivos en un dispositivo Android? mediante la comunicación Bluetooth logro enviar cadenas mas no archivos, es posible usar este ejemplo que muestras para enviar/recibir con Android?

  10. Jorge says:

    Hola, disculpa, una pregunta:¿cómo se podría hacer para poder enviar datos enteros?
    Gracias, buen día.

    • Yoan pupo says:

      Los tipos primitivos de java se envian y reciben con DataInputStream y su correspondiente DataOutputStream, te recomiendo estudiar las capacidades del paquete java.io, es clave en el uso de sockets en java

  11. brackson says:

    Como hago para que mi clase Cliente también sea Servidor?

  12. Yeinner says:

    Hola Jorge, estuve revisando lo que hiciste sobre el uso de socket en java. tengo una duda, como haría esto mismo, pero utilizando el protocolo ModBusTCP/IP. Estoy trabajando en un proyecto de se quiere generar una comunicación con una dirección IP a través de un puerto (ejemplo: “192.168.11.127:9080″), pero no tengo mucho conocimiento sobre el tema. Agradecería tu ayuda.

  13. Por favor contacta con migo para un nuevo proyecto Saludos.

    • julio says:

      mm pero si quiero comunicar direntes redes digamios 192.168.41.2 cliente y el servidor 192.168.30.2 que parte de linea agregaria??? o que hacer

    • pool says:

      Para que se comuniquen las dos redes ya tendrías que configurar tu router. O si no poner tu NIC en modo forward.

  14. miguel AAR says:

    no se si tengas el codigo pero alreves

  15. Jorge says:

    hola recien stoy en esto de los socket. ahora quisiera saber como puedo hacer un socket para un programa de encriptacion. en este caso quiero hacer el polybios.

  16. langeweile says:

    was kann man bei langeweile machen

  17. gabriel says:

    Hola, necesito poder descargar un socket cliente y servidor para enviar dos tablas de una base de datos Mysql a un servidor. es posible??

  18. Nelson says:

    Hola muy buenos tus tutoriales gracias a ti he podido llegar a programar lo basico en java . Te deje la direccion de un blog que hice.

  19. Javier Diaz says:

    Animo colega buen codigo, me ha servido de mucho

  20. Luis says:

    Esta mala por que el cliente no recibe el mensaje del servidor, no lo recepciona.

  21. alemarchena says:

    Muchas gracias por el ejemplo, simple y concreto. Saludos

  22. 12345 says:

    pregunta telnet a que se refiere???

  23. Natalia says:

    Buenos días!
    pregunta cuando entra a la consola cmd cual es el comando que se tiene que escribir para que el server sepa que el cliente esta ingresando?
    estoy intentando de realizar la conexion cliente-servidor y sólo me inicia el servidor y sale que está esperando conexion del cliente

  24. These websites have an exclusive collection of most adored heroines.

    Red, of course, remains the color of choice for most people, especially
    men, but other colors are catching on. It is true that, Madhuri had got a skill from very beginning, but
    the skill had been given a professional touch by Saroj khan and other famous choreographer of the Hindi film industry.

  25. Lo tengo headphonesfor el personal a mi mamá
    para laas madres por la noche, además de ella completamrnte disfruté!

    Sus headphonesas realmente lindo y el que sugieren en la tarjeta que es va recipiente interior es muy emocional !!
    Y la excelente de las perlas ess ideal!
    SIN LUGAR A DUDAS, LA MUSICA NOS AYUDA AL CRECIMIENTO ESPIRITUAL, YA QUE PONE EN ARMONIA NUESTROS SENTIDOS.
    YA SEA EN LA MEDITACION O BIEN EN UNA ATMOSFERA DE DESCANSO.QUE DIOS LOS BENDIGA PORBRILLANTE MINISTERIO.BENDICIONES DESDE MONTERREY, MEXICO

  26. edwin says:

    un favor como hago un contador de visitas de paginas web utilizando sockets en java (cliente- servidor).

  27. Salvado directamente en marcadores!!, realmente me agrada tu website!

  28. Joe says:

    Good one! want some more stories dear!!

  29. news says:

    Some things aare going to be divided between the two of thuree straight declining ratings forr the theatre produced by Michael Martin as Charles celtic midsummer festivalks Hawtree blossoming into a colorful and lush.

  30. Andrés says:

    Pueden subir el .jar de cliente y servidor???

  31. Jose Juan says:

    Como puedo hacer la prueba de que funcione ?? , gracias espero puedan ayudarme, ya tengo las dos clases cliente y servidor en un paquete junto con el main y la creacion de los objetos y la llamada a los metodos, pero solo me arroja el mensaje de esperando conexión, soy nuevo en esto de las conexiones

  32. Miguel Vázquez says:

    Gracias por esta aportación, no podía realizar la comunicación entre dos computadoras, pero gracias a este documento, lo logré, muchas gracias.
    El problema que tenía, era que estaba utilizando el puerto 8080, pero lo cambié al puerto 5000 y funcionó.
    Saludos

  33. Ahaa, me resulta una conversacion interesante lo relacionado en este escrito que he
    encontrado en este web site, lo he revisado y ahora
    me motivaria mucho comentar. en esta pagina.

  34. javier says:

    hermano como hago para conectar 2 o 3 pc distintas a una misma base de datos en java?

  35. trofeos says:

     Magistral! No he sido capaz captar un internet web tan importante cimo este en completamente toda la red!

    La Mayoria De la referdencia es extremadamente positivo.

  36. El acabado de esta site es extremadamente bueno.

    ¿Serias Tan Amable De aconsejarme unos pocos consejos de diseño y estilo?
    Debido.

  37. jose says:

    dr nesesito programar un software que me permita conectar dos computadoras conectadas en red y poder chatear atravez, ya que nesesito probrar un dispositivo de envio de señales y nesesito probarla,soy estudiante de ing mecatronica

  38. Gilbert says:

    Gracias por la información, tengo una pregunta con respecto a un servidor local. Como hago si quiero tener la aplicación servidor activada en una computadora y la aplicación cliente en otra si ambas pertenecen a la misma red, e decir, como se conectarían?

  39. rivera says:

    hola que tal,veras tengo un proyecto que entregar en donde utilizo los sockets el proyecto consta en que una ves conectado un cliente a un servidor este pueda monitorear el estado de la maquina, a esto me refiero con la temperatura de la maquina ,informacion sobre ellla, uso de cpu y otras cuestiones que puedan ser de cierta forma monitoreadas ,el problemas es que no se que pueda utilizar en java para poder lograr esto,te lo agrade seria mucho si me pudieses ayudar.

  40. VIRY says:

    HOLA.! OYE SI ME PUEDES AYUDAR CON UN PROGRAMA DE DNS

  41. Arturo Escobar says:

    Hola amigo me podrías ayudar con una guía sobre como poder desarrollar una aplicación de diseño en 3d muchas gracias espero tu respuesta.

  42. julio maldonado says:

    saludos…. amigo … tu crees que me podrias ayudar con un pequeño desarrollo para escuchar unos gps a traves de un aplicativo en java … a su vez este que reciba la trama cruda .. parsee los datos los divida en cabeceras y los almacene en una base de datos ===???….. please si me pudieses ayudar en el proyecto ,,,, saludos

    • Mig says:

      Supo como recibir la trama y poder ver la estructura y el data, estoy desarrollando un proyecto similar(gps), solo que en lenguaje python, me sería de mucha ayuda, saludos!

  43. Liliana says:

    Hola, soy estudiante de ing. en sistemas computacionales y en mi clase de red, me sirvio bastante tutorial, si pudieras despues enseñarmos a construir el codigo estaria muy bien!!! gracias es excelente

  44. edgar says:

    necesito ayuda, necesito una aplicacion la cual me muestre el estado de una red y me muestre la velocidad de transmicion de datos y que me muestre cual puerto del switch este libre y me muestre cuales puertos estan ocupados.Gracias espero su ayudaa

  45. Jose says:

    ңola!
    Me ha gustado este articulo. Otгps articulos no mme molaron demasіado, en cualquier cɑso, еn general est

  46. fRANCISCO says:

    muy bien…!!! me ayudo mucho

  47. ivan says:

    Hola disculpa mira te comparto mi proyecto, necesito compartir video de un sistema de monitoreo en tiempo real esto es obiamente a traves de cliente servidor y no he encontrado la manera porfavor necesito ayuda!

  48. Theodore says:

    Hi, the whole thing is going perfectly here and ofcourse every one is sharing
    facts, that’s really excellent, keep up writing.

  49. Anegl says:

    Hola buena tarde tengo una pregunta no se si esta se la sección para preguntar hay alguna forma de obtener las características de una computadora Sistema Operativo, Mem RAM, Disco Duro, no de mi computadora si no de otra conectada en red Gracias.

  50. carlos says:

    Hola buen dia!

    Podrias ayudarme demasiado en explicarme como pudiese comunicar esas aplicaciones pero por medio de internet, osea que funcionen igual, solo que yo este en una casa y la otra persona en otra con diferentes modems.

    Es posible o no es posible. es que un profesor cuando le preguntamos nos indico que era imposible (un profesor muy creido) y queremos demostrarle que esta equivocado puedes ayudarme por favor.

    • Anonimo says:

      Claro que es posible, si para eso son los sockets. Internet por muy grande que sea sigue siendo una red.

      Solo necesitas la IP “real” con la que sales a Internet en el ordenador que tengas el servidor. Puedes poner en google ver mi ip… Y luego necesitas redirigir el puerto que vas a usar del router al ordenador donde tienes el server, para ello tienes que entrar en la configuración del router y buscar las opciones de redirigir puertos y listo.

  51. Oscar Aponte says:

    Muchas gracias por el aporte! Es genial compartir

  52. Christian says:

    Hola, oye, veo que el servidor le envia un mensaje al cliente ¿o me equivoco?, como le haces para que el cliente lo lea, por que no veo una linea donde el cliente imprima lo que el servidor le envia.

    Esta linea es la que le envia el servidor al cliente que se conecta:
    salida.writeUTF(“Conexión exitosa…n envia un mensaje “);

    Saludos!

  53. juan pablo says:

    esta buenisimo pero como podria hacer, en el caso de android, si es que me puedes dar una mano…. lo que que necesito es que un usuario que haga de cliente, pueda desde su movil ver los usuarios que estan haciendo de servidor, y bueno alli elegir a que servidor conectarse…

  54. AleMarchena says:

    Gracias por tu aporte, sencillo y concreto.
    Saludos

  55. Daniel says:

    Hola te reconozco por la foto, tus videos me han sido de mucha ayuda.

  56. Jason F says:

    Qué tal?, disculpa Jorge, me ha pedido un aplicativo web que tenga inserción, consulta y eliminación de multimedia, también que tenga el objeto de una cama ip que tiene user y password, si me podrías colaborar con esto en un tutorial o algo por el estilo.

    Gracias.

  57. Roberto says:

    Disculpa amigo, me han mandado a realizar un proyecto donde el servidor este realizado en un lenguaje(java,php,etc) y una plataforma(windows,ubuntu,mac) cualquiera; los clientes tienen que estar hechos en otros lenguajes y diferentes plataformas o sistemas operativos.
    Puede ser el servidor hecho con java y en windows, y un cliente hecho en java con ubuntu y otro hecho en php con windows.
    Nosotros decidimos hacer un proyecto sobre un grifo donde los clientes que lleguen a consumir se le dea un bonus o puntos, que luego estos clientes los van a canjear en una tienda de electrodomesticos que esta asociada con el grifo. Como debo de plantear ayudame porfavor lo mas antes posible

  58. Sergio Enrique says:

    Hola Jorge V. muy bueno tu articulo.
    Jorge queria hacerte una preguntica, depronto sepas y me puedas dar algun enfoque.
    Yo programo en Java y la espcificacion J2EE para crear aplicaciones WEB.
    Es posible enviar información desde el servidor al cliente sin necesidad de una petición por parte del cliente.
    Es decir desde el servidor de aplicaciones (servidor WEB, contenedor WEB), se pueden originar los mensajes para enviarselos al cliente (navegador WEB).
    Los clientes web pueden tener session (session HTTP) en el servidor.
    Esto implicaria trabajar con sockets para mantener las conexiones activas? el problema es que como una aplicacion web es sin estado, como se pistearia al navegador que tiene session, ademas como haria para mantener el socket en el cliente web es decir el navegador web. con algun applet?

    Por ejemplo si tuviéramos un chat en el que se comunican varias personas a la vez,
    una persona enviaría un texto al servidor y el servidor se lo enviaría a los demás participantes en la conversación sin necesidad de que los clientes estuvieran todo el tiempo realizando peticiones al servidor.
    He leído algo sobre sockets pero no se si se podría hacer lo que expongo arriba.

  59. reyna says:

    Hola… tengo mi aplicacion en java de escritorio quiero hacer que funcione en varias maquinas como tendria que poner el codigo, en mi proyecto agrego la clase de cliente y la servidor? y que tendria que hacer en la otra maquina para que me funcione?????

    • pelotes2 says:

      Échale una leída al concepto cliente/servidor. Para que funcione en diferentes máquinas tienes que correr en una máquina el servidor, y en las otras corres el cliente. Obviamente le cambias la parte que dice localhost, poniendo la ip de donde está corriendo la clase que realiza la función de servidor. Espero te sirva.

  60. teresienta says:

    Me gusto esta página muy bien explicado como tu explicación no ahi ninguna otra.. :)

  61. Jodanovi says:

    interesante hasta el momento lo que estuve leyendo, la idea final es armar un servidor de lectura de datos recibidos por gprs de un gps. Éxitos y seguiré mirando tus materiales

  62. Xi says:

    Gracias Jorge, muy útil la información.
    Incluso das mejor información que los instructores de los cursos de Microsoft, precisamente ahora estoy en uno y te lo llevas de calle.
    Gracias

Leave a Reply to miguel AAR Cancel reply

Your email address will not be published. Required fields are marked *