Cambios

De ChuWiki
Saltar a: navegación, buscar

Ejemplo Sencillo de TCP/IP con netty

2116 bytes añadidos, 14:28 1 ago 2018
El Servidor
* (4) Le pasamos los dos bucles de eventos que creamos antes, el del servidor para que acepte conexiones y el de los eventos de cada uno de los clientes ya conectados.
* (5) Estamos haciendo un Socket Servidor que acepte conexiones de clientes. Netty tiene varias clases que permiten hacer esto, aquí decimos la que queremos usar, NioServerSocketChannel. Esta usa la función select de java.nio. Hay otras implementaciones que usan entradas/salidas bloqueantes, o que usan epoll de linux y que sólo funcionan en linux. Para un java moderno, NioServerSocketChannel es una buena elección.
* (6)Llamamos al método childHandler pasándole un ChannelInitializer. Cada vez que un cliente se conecte, se llamará a (7) ChannelInitializer.initChannel() pasándole el SocketChannel con el cliente que se acaba de conectar, es decir, la conexión con dicho cliente. Aquí es donde tenemos que hacer cosas de nuestra cosecha para tratar los mensajes que nos envíe el cliente o para enviarle mensajes al cliente.* (8) Cada vez que sucede algo con el cliente (llega un mensaje, le enviamos un mensaje, se conecta, se desconecta, etc), netty provoca eventos a los que nos avisa si nos suscribimos. en la línea (8) es donde lo hacemos. En la llamada a ch.pipeline().addLast() pasamos una clase nuestra, serverHandler, que implementa la interfaz de netty correspondiente para recibir todos los eventos que nos interesen en la conexión con el cliente. Veremos esto con más detalle más adelante.* (9) Con el método option() podemos pasar todas las opciones que queramos típicas de un socket servidor TCP/IP. El método option() afecta al socket servidor.* (10) con el método childOption() podemos pasar todas las opciones que queramos típicas de un socket servidor TCP/IP. El método childOption() afecta a los socket que se abran con el cliente, no al socket servidor.* (11) Hacemos el típico bind() del socket servidor, indicando el puerto que queremos. La llamada a bind() vuelve inmediatamente, con la llamada a sync() el código se queda aquí bloqueado hasta que el servidor está en marcha.* (12) f.channel() nos devuelve el canal (conexión) que hay en el socket servidor. closeFuture() nos devuelve una "cosa" (un future) que es algo que sucederá pero todavía no ha sucedido y ese algo, en este caso, es que se cierre el socket servidor. Si llamamos al método sync() de esa cosa futura, el método sync() se quedará bloqueado hasta que esa cosa futura (el cierre del socket) sea realidad. Como nadie cierra el socket (en este ejemplo), este sync() se quedará aquí para siempre. Si en algún sitio llamaramos a f.channel().close(), entonces se cerraría el socket y el sync() acabaría saliendo.

Menú de navegación