Escrevi um artigo antes: Java Network IO Programação Resumo (Bio, Nio e AIO contêm código de instância completo), que introduz como usar o suporte a IO nativo da Java para programação de rede. Este artigo apresenta um método mais simples, a saber, a estrutura Java Nio.
A Netty é uma das estruturas mais populares do NIO da indústria, com boa robustez, funcionalidade, desempenho, personalização e escalabilidade. Ao mesmo tempo, fornece uma API muito simples que simplifica bastante nossa programação de rede.
Como o artigo introduzido por Java IO, os exemplos mostrados neste artigo implementam a mesma função.
1. Lado do servidor
Servidor:
pacote com.anxpp.io.calculator.netty; importar io.netty.bootstrap.ServerbootStrap; importar io.netty.channel.channelfuture; importar io.netty.channel.channelinitializer; importar io.netty.channel.channelOption; importar io.netty.channel.eventloopgroup; importar io.netty.channel.nio.nioeventloopgroup; importar io.netty.channel.socket.socketchannel; importar io.netty.channel.socket.nio.nioserversocketchannel; Public Class Server {private int porta; servidor público (porta int) {this.port = porta; } public void run () lança Exceção {Eventloopgroup bossGroup = new NioEventloopgroup (); Eventloopgroup WorkerGroup = new NioEventloopgroup (); tente {serverBootStrap b = new ServerBootStrap (); b.group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class) .option(ChannelOption.SO_BACKLOG, 1024) .childOption(ChannelOption.SO_KEEPALIVE, true) .childHandler(new ChannelInitializer<SocketChannel>() { @Override public void initChannel(SocketChannel ch) throws Exception { ch.piPeline (). addlast (new ServerHandler ()); Channelfuture f = b.bind (porta) .sync (); System.out.println ("servidor on:"+porta); F.Channel (). CloseFuture (). Sync (); } finalmente {workergroup.shutdownGracely (); bossgroup.shutdownGracely (); }} public static void main (string [] args) lança exceção {int porta; if (args.length> 0) {porta = integer.parseint (args [0]); } else {porta = 9090; } novo servidor (porta) .run (); }}ServidorHandler:
pacote com.anxpp.io.calculator.netty; importar io.netty.buffer.bytebuf; importar io.netty.buffer.unpooled; importar io.netty.channel.channelHandlerContext; importar io.netty.Channel.ChannelInBoundHandlerAdapter; importar java.io.unsupportEnCodingException; importação com.anxpp.io.utils.calculator; public class ServerHandler estende o ChannelInBoundHandlerAdapter {@Override public void ChannelRead (ChannelHandlerContext ctx, objeto msg) lança não suportesCodingException {bytebuf in = (bytebuf) msg; byte [] req = novo byte [in.retableBytes ()]; in.readbytes (req); String body = new String (req, "utf-8"); System.out.println ("Mensagem do cliente recebida:"+corpo); String calrresult = null; tente {calrresult = calculator.instance.cal (corpo) .toString (); } catch (Exceção e) {calrRresult = "Expressão de erro:" + e.getMessage (); } ctx.write (nãooled.copiedBuffer (calrresult.getBytes ())); } @Override public void ChannelReadComplete (ChannelHandlerContext ctx) lança a exceção {ctx.flush (); } / *** Manuseio de exceção* / @Override public void ExceptionCaught (ChannelHandlerContext ctx, causa de arremesso) {caus.printStackTrace (); ctx.close (); }} pacote com.anxpp.io.calculator.netty; importar io.netty.buffer.bytebuf; importar io.netty.buffer.unpooled; importar io.netty.channel.channelHandlerContext; importar io.netty.Channel.ChannelInBoundHandlerAdapter; importar java.io.unsupportEnCodingException; importação com.anxpp.io.utils.calculator; public class ServerHandler estende o ChannelInBoundHandlerAdapter {@Override public void ChannelRead (ChannelHandlerContext ctx, objeto msg) lança não suportesCodingException {bytebuf in = (bytebuf) msg; byte [] req = novo byte [in.retableBytes ()]; in.readbytes (req); String body = new String (req, "utf-8"); System.out.println ("Mensagem do cliente recebida:"+corpo); String calrresult = null; tente {calrresult = calculator.instance.cal (corpo) .toString (); } catch (Exceção e) {calrRresult = "Expressão de erro:" + e.getMessage (); } ctx.write (nãooled.copiedBuffer (calrresult.getBytes ())); } @Override public void ChannelReadComplete (ChannelHandlerContext ctx) lança a exceção {ctx.flush (); } / *** Manuseio de exceção* / @Override public void ExceptionCaught (ChannelHandlerContext ctx, causa de arremesso) {caus.printStackTrace (); ctx.close (); }} 2. Cliente
Cliente:
pacote com.anxpp.io.calculator.netty; importar io.netty.bootstrap.bootstrap; importar io.netty.channel.channelfuture; importar io.netty.channel.channelinitializer; importar io.netty.channel.channelOption; importar io.netty.channel.eventloopgroup; importar io.netty.channel.nio.nioeventloopgroup; importar io.netty.channel.socket.socketchannel; importar io.netty.channel.socket.nio.niosocketchannel; importar java.util.scanner; Classe public client implementa Runnable {static clientHandler client = new clientHandler (); public static void main (string [] args) lança exceção {new Thread (new client ()). start (); @Suppresswarnings ("Recurso") Scanner Scanner = new Scanner (System.in); while (client.sendmsg (scanner.NextLine ())); } @Override public void run () {String host = "127.0.0.1"; int porta = 9090; Eventloopgroup WorkerGroup = new NioEventloopgroup (); tente {bootstrap b = new bootstrap (); B.Group (WorkerGroup); b.Channel (niosocketchannel.class); B.Option (ChannelOption.SO_Keepalive, True); b.Handler (novo canalinitializer <Socketchannel> () {@Override public void initchannel (Socketchannel ch) lança exceção {ch.piPeline (). addlast (client);}}); Channelfuture f = b.connect (host, porta) .sync (); F.Channel (). CloseFuture (). Sync (); } catch (interruptedException e) {e.printStackTrace (); } finalmente {workergroup.shutdownGracely (); }}}ClientHandler:
pacote com.anxpp.io.calculator.netty; importar io.netty.buffer.bytebuf; importar io.netty.buffer.unpooled; importar io.netty.channel.channelHandlerContext; importar io.netty.Channel.ChannelInBoundHandlerAdapter; importar java.io.unsupportEnCodingException; public class ClientHandler estende o ChannelInBoundHandlerAdapter {ChannelHandlerContext CTX; / *** Chamado após o currículo do link TCP ser bem -sucedido*/ @Override public void ChannelActive (ChannelHandlerContext ctx) lança exceção {this.ctx = ctx; } public boolean sendmsg (string msg) {System.out.println ("Cliente envia a mensagem:"+msg); byte [] req = msg.getBytes (); Bytebuf m = não -resfriado.buffer (req.length); M.WriteBytes (REQ); ctx.WriteAndflush (m); retornar msg.equals ("q")? Falso: true; } / *** Chamado após receber a mensagem do servidor* @THOWS UnsupportEdEncodingException* / @Override public void ChannelRead (ChannelHandlerContext ctx, objeto msg) lança sem suportesencodingException {bytebuf buf = (bytebuf) msg; byte [] req = novo byte [buf.retableBytes ()]; buf.readbytes (req); String body = new String (req, "utf-8"); System.out.println ("Mensagem do servidor:"+corpo); } / *** Chamado quando ocorre uma exceção* / @Override public void ExceptionCaught (ChannelHandlerContext ctx, causa de arremesso) {caus.printStackTrace (); ctx.close (); }} 3. Ferramentas para cálculo
pacote com.anxpp.io.utils; importar javax.script.scriptEngine; importar javax.script.scriptengineManager; importar javax.script.scriptException; public enum calculadora {instance; ScriptEngine estática final privada JSE = new ScriptEngineManager (). GetEngineByName ("JavaScript"); objeto público cal (expressão de string) lança scriptexception {return jse.eval (expressão); }} 4. Teste
Inicie o servidor e o cliente, respectivamente, e digite a expressão no console do 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-5*4/4/4
Você pode ver os resultados retornados pelo servidor.
Veja o console do servidor:
O servidor está ativado: 9090 Mensagem do cliente recebida: 1+5+5+5+5+5 Mensagem do cliente recebido: 156158*458918+125615 Mensagem do cliente recebida: 1895612+555+5+5+5+5+5+5+5+5+5-5-5*4/4 4/4
5. Mais
Artigos relacionados:
Resumo da programação da rede Java (bio, nio, aio contém código de instância completo)
O endereço do código-fonte deste exemplo e Java Bio Nio Aio Exemplo: https://github.com/anxpp/java-io.git
O conteúdo relacionado à Netty continuará sendo atualizado até que um servidor de comunicação simples seja concluído.
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.