Escribí un artículo antes: Java Network IO Programming Resumen (Bio, NIO y AIO contienen código de instancia completo), que presenta cómo usar el soporte de IO Native Native para la programación de redes. Este artículo presenta un método más simple, a saber, el marco Java NIO.
Netty es uno de los marcos NIO más populares de la industria, con buena robustez, funcionalidad, rendimiento, personalización y escalabilidad. Al mismo tiempo, proporciona una API muy simple que simplifica enormemente nuestra programación de red.
Al igual que el artículo presentado por Java IO, los ejemplos que se muestran en este artículo implementan la misma función.
1. Lado del servidor
Servidor:
paquete com.anxpp.io.calculator.netty; import io.netty.bootstrap.serverbootstrap; import io.netty.channel.channelfuture; import io.netty.channel.channelinitializer; import io.netty.channel.channeloption; import io.netty.channel.eventloopGroup; import io.netty.channel.nio.nioeventloopGroup; import io.netty.channel.socket.socketchannel; import io.netty.channel.socket.nio.nioserversocketchannel; Public Class Server {private int Port; Public Server (Int Port) {this.port = puerto; } public void run () lanza excepción {eventloopGroup bossGroup = new NioEventLoopGroup (); EventLoopGroup WorkerGroup = new NioEventLoopGroup (); intente {ServerBootstrap b = new ServerBootstrap (); B.Group (BossGroup, WorkerGroup) .Channel (nioserversocketchannel.class) .option (canalOption.so_backlog, 1024) .childOption (canalOption.so_keepalive, true) .childHandler (nuevo canalinitializer <socketchannel> () {@Ooverride público void initchannel (socketchethethetchethetchEnchannel Ch.Pipeline (). AddLast (nuevo serverHandler ()); Channelfuture f = B.Bind (puerto) .sync (); System.out.println ("servidor en:"+puerto); F.channel (). CloseFuture (). Sync (); } Finalmente {WorkerGroup.shutdownGRacefly (); bossgroup.shutdowngracefly (); }} public static void main (string [] args) arroja excepción {int puerto; if (args.length> 0) {port = Integer.ParseInt (args [0]); } else {port = 9090; } nuevo servidor (puerto) .run (); }}ServerHandler:
paquete com.anxpp.io.calculator.netty; import io.netty.buffer.bytebuf; import io.netty.buffer.unpooled; import io.netty.channel.channelhanderContext; import io.netty.channel.channelinboundhandlerAdapter; import java.io.unsupportedencodingException; import com.anxpp.io.utils.calculator; Public Class ServerHandler extiende ChannelInBoundHandLerAdapter {@Override public void canalread (canalHandlerContext CTX, Object Msg) lanza UnspportedEncodingException {byteBuf IN = (byteBuf) msg; byte [] req = new byte [in.readableBytes ()]; in.readbytes (req); String body = new String (req, "UTF-8"); System.out.println ("Mensaje del cliente recibido:"+cuerpo); Cadena calrResult = null; intente {calrResult = calculator.instance.cal (cuerpo) .toString (); } capt (excepción e) {calrResult = "expresión de error:" + e.getMessage (); } ctx.write (Unpoled.CopiedBuffer (calrRresult.getBytes ())); } @Override public void ChanneleadComplete (ChannelHandLerContext CTX) lanza la excepción {ctx.flush (); } / *** Manejo de excepciones* / @Override public void ExceptionCaught (ChannelHandLerContext CTX, Throwable Causa) {causa.printstackTrace (); ctx.close (); }} paquete com.anxpp.io.calculator.netty; import io.netty.buffer.bytebuf; import io.netty.buffer.unpooled; import io.netty.channel.channelhanderContext; import io.netty.channel.channelinboundhandlerAdapter; import java.io.unsupportedencodingException; import com.anxpp.io.utils.calculator; Public Class ServerHandler extiende ChannelInBoundHandLerAdapter {@Override public void canalread (canalHandlerContext CTX, Object Msg) lanza UnspportedEncodingException {byteBuf IN = (byteBuf) msg; byte [] req = new byte [in.readableBytes ()]; in.readbytes (req); String body = new String (req, "UTF-8"); System.out.println ("Mensaje del cliente recibido:"+cuerpo); Cadena calrResult = null; intente {calrResult = calculator.instance.cal (cuerpo) .toString (); } capt (excepción e) {calrResult = "expresión de error:" + e.getMessage (); } ctx.write (Unpoled.CopiedBuffer (calrRresult.getBytes ())); } @Override public void ChanneleadComplete (ChannelHandLerContext CTX) lanza la excepción {ctx.flush (); } / *** Manejo de excepciones* / @Override public void ExceptionCaught (ChannelHandLerContext CTX, Throwable Causa) {causa.printstackTrace (); ctx.close (); }} 2. Cliente
Cliente:
paquete com.anxpp.io.calculator.netty; import io.netty.bootstrap.bootstrap; import io.netty.channel.channelfuture; import io.netty.channel.channelinitializer; import io.netty.channel.channeloption; import io.netty.channel.eventloopGroup; import io.netty.channel.nio.nioeventloopGroup; import io.netty.channel.socket.socketchannel; import io.netty.channel.socket.nio.niosocketchannel; import java.util.scanner; Public Class Client implementa Runnable {static clientHandler Client = new ClientHandler (); public static void main (string [] args) lanza la excepción {new Thread (new Client ()). Start (); @SupessWarnings ("recurso") escáner escáner = new Scanner (System.in); while (client.sendmsg (scanner.nextline ())); } @Override public void run () {string host = "127.0.0.1"; Int Port = 9090; EventLoopGroup WorkerGroup = new NioEventLoopGroup (); intente {bootstrap b = new Bootstrap (); B. Group (WorkerGroup); B. Channel (niosocketchannel.class); B.Option (ChannelOption.so_keepalive, verdadero); B.Handler (New ChannelInitializer <Socketchannel> () {@Override public void initchannel (Socketchannel ch) arroja excepción {ch.pipeline (). addlast (cliente);}}); Channelfuture f = B.Connect (host, puerto) .sync (); F.channel (). CloseFuture (). Sync (); } catch (InterruptedException e) {E.PrintStackTrace (); } Finalmente {WorkerGroup.shutdownGRacefly (); }}}ClientHandler:
paquete com.anxpp.io.calculator.netty; import io.netty.buffer.bytebuf; import io.netty.buffer.unpooled; import io.netty.channel.channelhanderContext; import io.netty.channel.channelinboundhandlerAdapter; import java.io.unsupportedencodingException; ClassHandler de clase pública extiende ChannelInBoundHandlerAdapter {ChannelHandlerContext CTX; / *** Llamado después de que el currículum de enlace TCP sea exitoso*/ @Override public void ChannelActive (ChannelHandLerContext CTX) lanza la excepción {this.ctx = ctx; } public boolean sendmsg (string msg) {system.out.println ("Cliente envía un mensaje:"+msg); byte [] req = msg.getBytes (); Bytebuf m = Unpooled.Buffer (req.length); M.Writebytes (REQ); ctx.writeandflush (m); return msg.equals ("q")? falso: true; } / *** Llamado después de recibir el mensaje del servidor* @throws UnsupportedEnCodingException* / @Override public void canalread (ChannelHandLerContext CTX, Object MSG) lanza UnsupportedEnCodingException {byteBuf buf = (byteBufUf) msg; byte [] req = nuevo byte [buf.readableBytes ()]; buf.readbytes (req); String body = new String (req, "UTF-8"); System.out.println ("Mensaje del servidor:"+cuerpo); } / *** Llamado cuando ocurre una excepción* / @Override public void ExceptionCaught (ChannelHandLerContext CTX, Throwable Causa) {causa.printstackTrace (); ctx.close (); }} 3. Herramientas para el cálculo
paquete com.anxpp.io.utils; import javax.script.scriptEngine; import javax.script.scriptengineManager; import javax.script.scriptException; public enum calculador {instancia; Private final static scriptEngine jSE = new scriptenginemanager (). getEngenEnByName ("javaScript"); Public Object Cal (String Expression) lanza ScriptException {return jse.eval (expresión); }} 4. Prueba
Inicie el servidor y el cliente respectivamente, y luego ingrese la expresión en la consola del cliente:
1+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5*4/4/4/4/5/5/5/5/5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5-5*4/4/4
Puede ver los resultados devueltos por el servidor.
Ver la consola del servidor:
El servidor está habilitado: 9090 Mensaje del cliente recibido: 1+5+5+5+5+5 Mensaje del cliente recibido: 156158*458918+125615 Mensaje del cliente recibido: 1895612+555+5+5+5+5+5+5+5+5+5+5-5*4/4
5. Más
Artículos relacionados:
Resumen de programación IO de Java Network (Bio, NIO, AIO, todos contienen código de instancia completo)
La dirección Git del código fuente de este ejemplo y Java Bio Nio AIO Ejemplo: https://github.com/anxpp/java-io.git
El contenido relacionado con Netty continuará actualizándose hasta que se complete un simple servidor de comunicación.
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.