Ejemplo multicast con Netty

De ChuWiki
Saltar a: navegación, buscar

Vamos con un ejemplo multicast en netty. Aunque he mirado el que hay por google, veo que muchas de las opciones que pone no sirven aparentemente para nada, así que el de aquí es con lo mínimo que he visto imprescindible para hacerlo funcionar. Aquí tienes el ejemplo de multicast con netty

El servidor (el que escucha)

Veamos el código del que se pone a a escucha, lo he llamado servidor, pero no tiene mucho sentido, digo yo. El código es este

        NetworkInterface ni = NetworkInterface.getByInetAddress(InetAddress.getByName("127.0.0.1"));  // (1)

        InetSocketAddress groupAddress = new InetSocketAddress(
                "239.255.27.1", 1234);  //(2)

        EventLoopGroup group = new NioEventLoopGroup();
        Bootstrap b = new Bootstrap();
        b.group(group)  // (3)
            .channelFactory(new ChannelFactory<NioDatagramChannel>() {  // (4)
                @Override
                public NioDatagramChannel newChannel() {
                    return new NioDatagramChannel(InternetProtocolFamily.IPv4);
                }
            })
//            .channel(NioDatagramChannel.class)  // (4)
            .handler(new ChannelInitializer<NioDatagramChannel>() {
                @Override
                protected void initChannel(NioDatagramChannel ch) throws Exception {
                    ch.pipeline().addLast(new ServerHandler());
                }
            })
            .option(ChannelOption.SO_REUSEADDR,true);

        NioDatagramChannel ch = (NioDatagramChannel)b.bind(groupAddress.getPort()).sync().channel();
        ch.joinGroup(groupAddress,ni).sync();

        ch.closeFuture().await();
<\syntaxhighlight>

Vamos por partes:

* (1) Necesitamos la interfaz de red por la que vamos a escuchar. Netty no admite ponernos a la escucha de todas las interfaces de red de forma fácil (hay un "workaround" que comento más tarde). Así que cogemos una de ellas por su IP. Como 127.0.0.1 existe en todos los ordenadores (localhost) cogemos esa para que funcione el ejemplo, pero esto obliga a que el que emite lo haga dentro del mismo pc y por esa interfaz de red. Si quieres puedes poner tu IP de red y así escuchas cosas del exterior.
* (2) Una IP de multicast y puerto, para usarla.
* (3) Como ya vimos en [[Ejemplo Sencillo de TCP/IP con netty]] usamos la clase de ayuda Bootstrap de netty para crearnos un canal multicast, al que tenemos que crear un bucle de eventos y pasárselo.
* (4) Con el método channel() podemos pasar el tipo de channel que queremos crear (NioDatagramChannel en nuestro ejemplo). El problema de usar este método y pasar el class, es que se creará con el constructor de NioDatagramChannel por defecto, que cogerá IPv4 o IPv6 según esté configurado por defecto en nuestro ordenador. Si nos vale la opción por defecto, estupendo, pero si no nos vale, es mejor usar en vez de channel() el método channelFactory() al que pasamos una ChanneFactory que en su método newChannel() nos debe devolver una intancia del channel que queremos, en este ejemplo, un NioDatagramChannel configurado para IPv4.


[[Categoría:Java]][[Categoría:Netty]]