Я написал статью ранее: Сводка программирования Java Network (Bio, Nio и AIO содержит полный код экземпляра), в котором представлено, как использовать поддержку IO, нативную Java для сетевого программирования. Эта статья представляет более простой метод, а именно фреймворк Java Nio.
Netty является одной из самых популярных рамок NIO в отрасли, с хорошей надежностью, функциональностью, производительностью, настройкой и масштабируемостью. В то же время он обеспечивает очень простой API, который значительно упрощает наш сетевой программирование.
Как и статья, представленная Java IO, примеры, показанные в этой статье, реализуют ту же функцию.
1. Серверная сторона
Сервер:
пакет com.anxpp.io.calculator.netty; Импорт io.netty.bootstrap.serverbootstrap; Импорт io.netty.channel.channelfuture; Импорт io.netty.channel.channelinitialize; Импорт io.netty.channel.channeloption; Импорт io.netty.channel.eventloopgroup; Импорт io.netty.channel.nio.nioeventloopgroup; Импорт io.netty.channel.socket.socketchannel; Импорт io.netty.channel.socket.nio.nioserversocketchannel; Общедоступный сервер класса {private int port; public Server (int port) {this.port = port; } public void run () бросает exection {eventloopgroup bossgroup = new nioeventloopgroup (); EventLoopGroup WorkerGroup = new nioeventloopgroup (); try {serverBootStrap b = new ServerBootStrap (); B.Group (BossGroup, WorkerGroup) .Channel (nioServersocketchannel.class) .Option (channeloption.so_backlog, 1024) .ChildoPtion (Channeloption.so_keepalive, True) .ChildHandler (новый канал HANLINITIALIGER <Socketchannel> () { @Override public initchannel (socketchenkannel) ch.pipeline (). Addlast (new ServerHandler ()); Channelfuture f = b.bind (порт) .sync (); System.out.println ("Сервер On:"+Port); f.channel (). CloseFuture (). Sync (); } наконец {korkergroup.shutdowngracebount (); bossgroup.shutdowngracebout (); }} public static void main (string [] args) бросает исключение {int port; if (args.length> 0) {port = integer.parseint (args [0]); } else {port = 9090; } новый сервер (порт) .run (); }}Сервер -индлер:
пакет com.anxpp.io.calculator.netty; Импорт io.netty.buffer.bytebuf; Импорт io.netty.buffer.unpooled; Импорт io.netty.channel.channelhandlercontext; Импорт io.netty.channel.ChannelInboundHandlerAdapter; импортировать java.io.unsupportedencodingexception; импорт com.anxpp.io.utils.calculator; Общедоступный класс ServerHandler Extends ChannelInBoundHandlerAdapter {@Override public void ChannelRead (ChannelHandLercOntext CTX, Object MSG) бросает UnsUpportedEncodingException {bytebuf in = (bytebuf) msg; byte [] req = new Byte [in.readableBytes ()]; in.readbytes (req); String Body = new String (req, "UTF-8"); System.out.println ("Полученное клиентское сообщение:"+body); String calrresult = null; try {calrResult = calculator.instance.cal (тело) .toString (); } catch (Exception e) {calrSult = "Выражение ошибки:" + e.getMessage (); } ctx.write (unpooled.copiedbuffer (calrresult.getbytes ())); } @Override public void handerReadComplete (ChannelHandlerContext ctx) выбрасывает exection {ctx.flush (); } / *** Обработка исключений* / @Override public void exceptionCaught (ChannelHandlerContext ctx, бросаемая причина) {canes.printstacktrace (); ctx.close (); }} пакет com.anxpp.io.calculator.netty; Импорт io.netty.buffer.bytebuf; Импорт io.netty.buffer.unpooled; Импорт io.netty.channel.channelhandlercontext; Импорт io.netty.channel.ChannelInboundHandlerAdapter; импортировать java.io.unsupportedencodingexception; импорт com.anxpp.io.utils.calculator; Общедоступный класс ServerHandler Extends ChannelInBoundHandlerAdapter {@Override public void ChannelRead (ChannelHandLercOntext CTX, Object MSG) бросает UnsUpportedEncodingException {bytebuf in = (bytebuf) msg; byte [] req = new Byte [in.readableBytes ()]; in.readbytes (req); String Body = new String (req, "UTF-8"); System.out.println ("Полученное клиентское сообщение:"+body); String calrresult = null; try {calrResult = calculator.instance.cal (тело) .toString (); } catch (Exception e) {calrSult = "Выражение ошибки:" + e.getMessage (); } ctx.write (unpooled.copiedbuffer (calrresult.getbytes ())); } @Override public void handerReadComplete (ChannelHandlerContext ctx) выбрасывает exection {ctx.flush (); } / *** Обработка исключений* / @Override public void exceptionCaught (ChannelHandlerContext ctx, бросаемая причина) {canes.printstacktrace (); ctx.close (); }} 2. Клиент
Клиент:
пакет com.anxpp.io.calculator.netty; Импорт io.netty.bootstrap.bootstrap; Импорт io.netty.channel.channelfuture; Импорт io.netty.channel.channelinitialize; Импорт io.netty.channel.channeloption; Импорт io.netty.channel.eventloopgroup; Импорт io.netty.channel.nio.nioeventloopgroup; Импорт io.netty.channel.socket.socketchannel; Импорт io.netty.channel.socket.nio.niosocketchannel; импортировать java.util.scanner; Общедоступный клиент Клиент реализует {static clientHandler client = new ClientHandler (); public static void main (string [] args) бросает исключение {new Thread (new Client ()). start (); @Suppresswarnings ("resource") сканер сканер = новый сканер (System.in); while (client.sendmsg (scanner.nextline ())); } @Override public void run () {string host = "127.0.0.1"; int port = 9090; EventLoopGroup WorkerGroup = new nioeventloopgroup (); try {bootstrap b = new Bootstrap (); B.Group (Workergroup); B.Channel (niocketchannel.class); b.option (channeloption.so_keepalive, true); B.Handler (новый ChannelInitializer <socketchannel> () {@Override public void initchannel (socketchannel ch) throws exception {ch.pipeline (). Addlast (client);}}); Channelfuture f = b.connect (хост, порт) .sync (); f.channel (). CloseFuture (). Sync (); } catch (прерванное искусство e) {e.printstacktrace (); } наконец {korkergroup.shutdowngracebount (); }}}ClientHandler:
пакет com.anxpp.io.calculator.netty; Импорт io.netty.buffer.bytebuf; Импорт io.netty.buffer.unpooled; Импорт io.netty.channel.channelhandlercontext; Импорт io.netty.channel.ChannelInboundHandlerAdapter; импортировать java.io.unsupportedencodingexception; Public Class ClientHandler Extends ChannelInboundHandlerAdapter {ChannelHandlerContext CTX; / *** Вызовов после успешного резюме ссылки TCP*/ @override public void gannelactaint (Channelhandlercontext ctx) throws exection {this.ctx = ctx; } public boolean sendmsg (String msg) {System.out.println ("Клиент отправляет сообщение:"+msg); byte [] req = msg.getbytes (); Bytebuf m = unpooled.buffer (req.length); M.WriteBytes (req); ctx.writeandflush (m); вернуть msg.equals ("q")? false: true; } / *** Вызывается после получения сообщения сервера* @Throws UnsupportEncodingException* / @@override public void handerread (channelhandlercontext ctx, Object msg) бросает UnsupportedEncodingException {bytebuf buf = (bytebuf) msg; byte [] req = new Byte [buf.readableBytes ()]; buf.readbytes (req); String Body = new String (req, "UTF-8"); System.out.println ("Сообщение сервера:"+body); } / *** Вызывается, когда происходит исключение* / @override public void exceptionCaught (ChannelHandlercontext ctx, бросаемая причина) {canes.printstacktrace (); ctx.close (); }} 3. Инструменты для расчета
пакет com.anxpp.io.utils; import javax.script.scriptengine; импорт javax.script.scriptenginemanager; import javax.script.scriptexception; public enum calculator {encement; Частный финальный статический сценарий jse = new ScriptengineManager (). getEngineByName ("javaScript"); public Object Cal (String Expression) Throws Scriptexception {return jse.eval (Expression); }} 4. Тест
Запустите сервер и клиент соответственно, а затем введите выражение на клиентской консоли:
1+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5*4/4/4/5/5/5/5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5-5*4/4/4
Вы можете увидеть результаты, возвращаемые сервером.
Посмотреть консоли сервера:
Сервер включен: 9090 Полученное клиентское сообщение: 1+5+5+5+5+5 Полученное клиентское сообщение: 156158*458918+125615 Полученное клиентское сообщение: 1895612+555+5+5+5+5+5+5+5+5-5*4/4+5+5+5+5+5+5+
5. Подробнее
Связанные статьи:
Java Network IO Сводка программирования (Bio, Nio, AIO содержит полный код экземпляра)
Адрес исходного кода GIT этого примера и Java Bio Nio AIO Пример: https://github.com/anxpp/java-io.git
Контент, связанный с нетти, будет продолжать обновляться до тех пор, пока не будет завершен простой сервер связи.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.