Cambios

De ChuWiki
Saltar a: navegación, buscar

Pipeline con netty

3337 bytes añadidos, 15:09 4 ago 2018
Las otras dos clases (la que convierte el mensaje a bytes y la que añade el separador) deben ser ChannelOutboundHandler y sobreescribir el método write(). A este método es al que llamará netty cuando quiera escribir en el socket. Al igual que en el caso anterior, cada handler recibirá como parámetro de este método el objeto que nos entregue el handler anterior.
=== Lógica de negocio === Como hicimos en [[Ejemplo Sencillo de TCP/IP con netty]] usaremos el handler de cliente, que es más sencillo. Es este <syntaxhighlight lang="java">package com.chuidiang.examples4; import io.netty.channel.ChannelFuture;import io.netty.channel.ChannelHandlerContext;import io.netty.channel.ChannelInboundHandlerAdapter; public class ClientHandler extends ChannelInboundHandlerAdapter{ private ChannelHandlerContext ctx;  @Override public void handlerAdded(ChannelHandlerContext ctx) throws Exception { this.ctx=ctx; }  @Override public void handlerRemoved(ChannelHandlerContext ctx) throws Exception { ctx=null; }  public void sendMessage(String msg){ if (null==ctx) return; ChannelFuture channelFuture = ctx.write(msg); ctx.flush(); }}</syntaxhighlight> En el método handlerAdded() nos guardamos el ChannelHandlerContext, que nos servirá para enviar mensajes por el socket. En handlerRemoved() lo eliminamos, puesto que dejaremos de estar conectados al socket. Hemos puesto un método sendMessage(String) donde enviamos el mensaje en formato nuestro (String) y no como ByteBuf. Simplemente llamamos a ctx.write(msg) para enviar este mensaje, tal cual, como String, al siguiente handler. === String Encoder === El siguiente handler en la cadena tiene que convertir este String a ByteBuf (o byte[] o cualquier otro tipo de array de bytes que entienda el siguiente handler, que como también es nuestro, solo tenemos que estar de acuerdo con nosotros mismos). Enviamos el array de buffer nuevamente con ctx.write() <syntaxhighlight lang="java">public class StringEncoder extends ChannelOutboundHandlerAdapter{ @Override public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception { String text = (String)msg; ByteBuf buf = Unpooled.copiedBuffer(text.getBytes()); ctx.write(buf,promise); }}</syntaxhighlight> Hemos heredado de ChannelOutboundHandlerAdapter para no sobreescribir todos los métodos de la interface y hemos sobreescrito el método write(). En este método recibidmos msg como String, que es lo que nos ha enviado el handler anterior. Lo convertimos a un ByteBuf y lo escribmos con ctx.write(). Este ByteBuf es lo que recibirá nuestro siguiente handler en la cadena. === Frame Maker === El último handler sólo tiene que añadir el retorno de carro. Nuevamente heredamos de ChannelOutboundHandlerAdapter y sobreescribimos el método write() <syntaxhighlight lang="java">public class FrameMaker extends ChannelOutboundHandlerAdapter{ @Override public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception { ByteBuf buff = ctx.alloc().buffer(); buff.writeBytes((ByteBuf)msg); buff.writeByte('\n'); ctx.write(buff,promise); ReferenceCountUtil.release(msg); }}</syntaxhighlight>  Creamos un nuevo ByteBuf, copiamos con writeBytes() el contenido que nos ha llegado y añadimos con writeByte() el retorno de carro. Pasamos este nuevo ByteBuf con retorno de carro a netty para que lo mande por socket (no hay más handler nuestros, así que netty lo mandará por el socket) y liberamos el msg que hemos recibido.  === Todo junto ===  
[[Categoría:Java]][[Categoría:Netty]]

Menú de navegación