Anuncios

Bienvenidos sean a este post, hoy hablaremos sobre la posibilidad de poder hacer programas que se puedan ejecutar en varios dispositivos los cuales estan todos conectados por la misma red.

Anuncios

El paquete java.net contiene la coleccion de clases y metodos que proveen detalles de comunicacion a bajo nivel y permitiendo escribir programas que nos facilitan este tipo de tareas, el paquete soporta dos de los protocolos mas utilizados sobre la red:

  • TCP, significa Protocolo de Control de Transmision (por sus siglas en ingles), este protocolo es utilizado para conexion estables entre dos aplicaciones
  • UDP, significa Protocolo de Datagrama de Usuario (por sus siglas en ingles), una conexion menos protocolar y permite enviar paquetes de informacion a otra aplicacion sin necesidad de recibir la notificacion de que haya sido recibido
Anuncios

Estos dos protocolos corren sobre el Protocolo de Internet (IP) por lo que en general son los mas utilizados ya que son la base de tanto las redes locales de una casa o empresa (LAN) como de la internet (WAN), para continuar con nuestro tema hablemos sobre los sockets.

Anuncios

Los sockets proveen el mecanismo de comunicacion entre dos dispositivos utilizando TCP, el programa cliente crea un Socket que en su otro extremo intenta conectarse al socket de un servidor, una vez realizada esta conexion el servidor crea un objeto de tipo socket en su lado de comunicacion, esto permite que tanto el cliente como el servidor podran leer y escribir en este socket permitiendo comunicarse entre ellos.

Anuncios

La clase java.net.Socket representa al socket y la clase java.net.SocketServer provee un mecanismo para que el programa servidor escuche a los clientes y asi poder establecer una comunicacion entre ambos, estos son los pasos que ocurren cuando se establece la comunicacion entre dos dispositivos:

  • El servidor instancia un objeto ServerSocket, diciendo cual numero de puerto de conexion se utilizara
  • El servidor invoca al metodo accept() de la clase ServerSocket, este metodo espera hasta que un cliente se conecte en el puerto indicado anteriormente
  • Con el servidor funcionando, el cliente instancia a un objeto Socket, donde especificaremos el servidor y el puerto a conectarse
  • El constructor de la clase Socket intenta conectar al cliente con el servidor especificado y si la comunicacion es establecida ahora disponemos de un objeto Socket que permitira la comunicacion entre ambos
  • Del lado del servidor accept() devuelve una referencia a un nuevo socket en el servidor que es conectado al socket del cliente
Anuncios

Con la conexion establecida la comunicacion utiliza streams de I/O (Entrada/Salida por sus siglas en ingles), cada Socket tiene los metodos OutputStream e InputStream y podemos decir que el cliente de OutputStream se conecta al InputStream del servidor y el OutputStream del servidor al InputStream del cliente, la ventaja de TCP es que permite una comunicacion en ambos sentidos y por ende se puede enviar informacion simultaneamente, a continuacion veremos los constructores para la clase ServerSocket:

  • public ServerSocket(int puerto) throws IOException, intenta crear un objeto socket con el puerto especificado, la excepcion puede ocurrir si el puerto esta siendo utilizado
  • public ServerSocket(int puerto, int backlog) throws IOException, similar al anterior pero backlog indicara la cantidad de clientes a almacenar que iran a la cola de espera
  • public ServerSocket(int puerto, int backlog, inetAddres direccion) throws IOException, similar al anterior pero el ultimo parametro va a ser la direccion IP donde establecera la conexion
  • public ServerSocket() throws IOException, crea un socket de servidor independiente. Cuando use este constructor, use el método bind() cuando esté listo para enlazar el socket del servidor.
Anuncios

Si despues de utilizado algunos de estos constructores no arrojo ninguna excepcion podemos decir que hemos creado de forma exitosa un servidor y esta a la espera de clientes para comunicarse, nuestra siguiente lista sera sobre algunos de los metodos disponibles para esta clase:

  • public int getLocalPort(), devuelve el puerto que esta escuchando el servidor, esto es util si pasamos un numero de puerto en cero y dejamos que el servidor defina uno por usted
  • public Socket accept() throws IOException, espera por un proximo cliente, este método se bloquea hasta que un cliente se conecta al servidor en el puerto especificado o el tiempo de espera del socket sino se establece alguno este método se bloquea indefinidamente
  • public void setSoTimeout(int timeout), setea el valor de tiempo de espera por cuanto el socket server espera por un cliente durante el accept()
  • public void bind(SocketAddress host, int backlog), especifica el servidor y puerto especificado al objeto SocketAddress, este debe usarse cuando se instancia por medio del constructor sin parametros antes visto.
Anuncios

Cuando ServerSocket invoca accept() el metodo no devuelve nada hasta que el cliente se conecta, una vez establecida la conexion, este crea un nuevo Socket a un puerto no especificado y devuelve la referencia a este nuevo Socket y con esto la conexion TCP entre cliente y servidor ha sido establecida y podemos decir que la comunicacion puede comenzar.

Nuestro siguiente tema sera la clase Socket, esta pertenece a java.net.Socket y este es el verdadero socket que permite realmente la comunicacion entre el cliente y el servidor, el cliente obtiene un objeto Socket por la instancion de uno, en cambio el servidor obtiene por el valor devuelto del metodo accept(), a continuacion veremos los constructores de la clase Socket:

Anuncios
  • public Socket(String host, int puerto) throws UnknownHostException, IOException, este metodo intenta conectarse al servidor y puerto informados, sino devuelve ninguna de las dos excepciones significa que la conexion fue exitosa
  • public Socket(inetAddress host, int puerto) throws IOException, es similar al anterior pero el host es un objeto del tipo inetAddress
  • public Socket(String host, int puerto, inetAddress localAdrress, int localPort) throws IOException, conecta al servidor y puerto especificado y a su vez crea un socket con la direccion y puerto local informado
  • public Socket(inetAddress host, int puerto, inetAddress localAddress, int localPort) throws IOException, similar al anterior pero la direccion del servidor en lugar de ser String es de tipo inetAddress
  • public Socket(), crea un socket sin conexion, para conectarse debe utilizar el metodo connect() para conectarse a un server
Anuncios

Cuando el constructor vuelve no solamente instancia un objeto de tipo Socket sino que a su vez intenta la conexion al servidor donde en caso de ser exitosa nos permitira utilizar alguno de los metodos que describiremos a continuacion, tengan en cuenta que de ambos extremos tenemos un objeto Socket lo que implica que los siguientes metodos pueden ser utilizados tanto por el cliente como por el servidor:

  • public void connect(SocketAddress host, int timeout) throws IOException, este metodo conecta al servidor especificado pero solamente se usa cuando utilizamos el constructor sin parametros
  • public InetAddress getInetAddress(), devuelve la direccion de la otra computadora conectada al socket
  • public int getPort(), devuelve el puerto del socket informado en el equipo remoto
  • public int getLocalPort(), devuelve el puerto del socket informado en el equipo local
  • public SocketAddress getRemoteSocketAddress(), devuelve la direccion del equipo remoto
  • public InputStream getInputStream() throws IOException, devuelve el stream de entrada del socket, el stream de entrada esta conectado al stream de salida del equipo remoto
  • public OutputStream getOutputStream() throws IOException, devuelve el stream de salida del socket, el stream de salida esta conectado al stream de entrada del equipo remoto
  • public void close() throws IOException, cierra el socket y este metodo hace que el objeto socket no pueda conectarse a ningun servidor
Anuncios

Con esto terminamos la primera parte sobre Networking, en el proximo post hablaremos un poco mas sobre otra clase y veremos un ejemplo para entender el concepto de cliente/servidor.

Anuncios

En resumen, hoy hemos iniciado el tema de networking para Java, hemos hablado sobre Socket, tanto del Socket como del SocketServer, hemos visto los constructores y los metodos de estas clases, espero les haya sido util sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios

Tengo un Patreon donde podes acceder de manera exclusiva a material para este blog antes de ser publicado, sigue los pasos del link para saber como.

Tambien podes donar

Es para mantenimiento del sitio, gracias!

$1.00