亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

Java NIO框架Netty簡單使用的示例

2024-07-13 10:15:42
字體:
來源:轉載
供稿:網友

之前寫了一篇文章:Java 網絡IO編程總結(BIO、NIO、AIO均含完整實例代碼),介紹了如何使用Java原生IO支持進行網絡編程,本文介紹一種更為簡單的方式,即Java NIO框架。

Netty是業界最流行的NIO框架之一,具有良好的健壯性、功能、性能、可定制性和可擴展性。同時,它提供的十分簡單的API,大大簡化了我們的網絡編程。

同Java IO介紹的文章一樣,本文所展示的例子,實現了一個相同的功能。

1、服務端

Server:

package 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 = port;   }   public void run() throws Exception {     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(new ChannelInitializer<SocketChannel>() {          @Override          public void initChannel(SocketChannel ch) throws Exception {            ch.pipeline().addLast(new ServerHandler());          }        });       ChannelFuture f = b.bind(port).sync();       System.out.println("服務器開啟:"+port);       f.channel().closeFuture().sync();     } finally {       workerGroup.shutdownGracefully();       bossGroup.shutdownGracefully();     }   }   public static void main(String[] args) throws Exception {     int port;     if (args.length > 0) {       port = Integer.parseInt(args[0]);     } else {       port = 9090;     }     new Server(port).run();   } } 

ServerHandler:

package com.anxpp.io.calculator.netty; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInboundHandlerAdapter; import java.io.UnsupportedEncodingException; import com.anxpp.io.utils.Calculator; public class ServerHandler extends ChannelInboundHandlerAdapter {   @Override   public void channelRead(ChannelHandlerContext ctx, Object msg) throws 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(body).toString();     }catch(Exception e){       calrResult = "錯誤的表達式:" + e.getMessage();     }     ctx.write(Unpooled.copiedBuffer(calrResult.getBytes()));   }   @Override   public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {     ctx.flush();   }   /**    * 異常處理    */   @Override   public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {     cause.printStackTrace();     ctx.close();   } } package com.anxpp.io.calculator.netty; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInboundHandlerAdapter; import java.io.UnsupportedEncodingException; import com.anxpp.io.utils.Calculator; public class ServerHandler extends ChannelInboundHandlerAdapter {   @Override   public void channelRead(ChannelHandlerContext ctx, Object msg) throws 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(body).toString();     }catch(Exception e){       calrResult = "錯誤的表達式:" + e.getMessage();     }     ctx.write(Unpooled.copiedBuffer(calrResult.getBytes()));   }   @Override   public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {     ctx.flush();   }   /**    * 異常處理    */   @Override   public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {     cause.printStackTrace();     ctx.close();   } } 

2、客戶端

Client:

package 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 implements Runnable{   static ClientHandler client = new ClientHandler();   public static void main(String[] args) throws Exception {     new Thread(new Client()).start();     @SuppressWarnings("resource")     Scanner scanner = 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();     try {       Bootstrap b = new Bootstrap();       b.group(workerGroup);       b.channel(NioSocketChannel.class);       b.option(ChannelOption.SO_KEEPALIVE, true);       b.handler(new ChannelInitializer<SocketChannel>() {         @Override         public void initChannel(SocketChannel ch) throws Exception {           ch.pipeline().addLast(client);         }       });       ChannelFuture f = b.connect(host, port).sync();       f.channel().closeFuture().sync();     } catch (InterruptedException e) {       e.printStackTrace();     } finally {       workerGroup.shutdownGracefully();     }   } } 

ClientHandler:

package com.anxpp.io.calculator.netty; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInboundHandlerAdapter; import java.io.UnsupportedEncodingException; public class ClientHandler extends ChannelInboundHandlerAdapter {   ChannelHandlerContext ctx;   /**    * tcp鏈路簡歷成功后調用    */   @Override   public void channelActive(ChannelHandlerContext ctx) throws Exception {     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);     return msg.equals("q")?false:true;   }   /**    * 收到服務器消息后調用    * @throws UnsupportedEncodingException    */   @Override   public void channelRead(ChannelHandlerContext ctx, Object msg) throws 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, Throwable cause) {     cause.printStackTrace();     ctx.close();   } } 

3、用于計算的工具類

package com.anxpp.io.utils;import javax.script.ScriptEngine;import javax.script.ScriptEngineManager;import javax.script.ScriptException;public enum Calculator {  Instance;  private final static ScriptEngine jse = new ScriptEngineManager().getEngineByName("JavaScript");  public Object cal(String expression) throws ScriptException{    return jse.eval(expression);  }}

4、測試

分別啟動服務端和客戶端,然后再客戶端控制臺輸入表達式:

1+5+5+5+5+5客戶端發送消息:1+5+5+5+5+5服務器消息:26156158*458918+125615客戶端發送消息:156158*458918+125615服務器消息:7.1663842659E101895612+555+5+5+5+5+5+5+5-5*4/4客戶端發送消息:1895612+555+5+5+5+5+5+5+5-5*4/4服務器消息:1896197

可以看到服務端返回的結果。

查看服務端控制臺:

服務器開啟:9090收到客戶端消息:1+5+5+5+5+5收到客戶端消息:156158*458918+125615收到客戶端消息:1895612+555+5+5+5+5+5+5+5-5*4/4

5、更多

相關文章:

 Java 網絡IO編程總結(BIO、NIO、AIO均含完整實例代碼)

本文例子以及Java BIO NIO AIO例子的源碼Git地址:https://github.com/anxpp/Java-IO.git

后續會繼續更新Netty相關內容,直到一個簡陋的通訊服務器完成。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩欧美视频一区二区三区| 91精品一区二区| 国产91在线播放精品91| 日韩精品免费在线| 国产午夜精品全部视频在线播放| 午夜精品一区二区三区在线播放| 欧美成人自拍视频| 久久天天躁夜夜躁狠狠躁2022| 欧美xxxx18性欧美| 亚洲午夜久久久久久久| 午夜精品久久久久久99热| 91系列在线观看| 日韩国产高清视频在线| 日本免费一区二区三区视频观看| 国产成人av在线| 国产综合久久久久久| 久久97久久97精品免视看| 亚洲黄色av女优在线观看| 久久综合免费视频| 91高清在线免费观看| 久久精品国产清自在天天线| 日韩视频精品在线| 亚洲欧洲成视频免费观看| 亚洲品质视频自拍网| 中文字幕日韩av| 少妇高潮 亚洲精品| 2019日本中文字幕| 亚洲影视中文字幕| 欧美日韩一区二区免费视频| 日韩一区二区三区在线播放| 性欧美xxxx交| 国产欧美日韩精品丝袜高跟鞋| 久久久噜噜噜久久久| 韩国福利视频一区| 成人精品视频久久久久| 91精品国产91久久久久| 国产va免费精品高清在线观看| 亚洲人成电影网站色www| 久久偷看各类女兵18女厕嘘嘘| 国产成人+综合亚洲+天堂| 欧美另类交人妖| 久久全球大尺度高清视频| 日本欧美国产在线| 国产成人精品视频在线| 欧美国产日韩中文字幕在线| 国产精品久久久久久亚洲调教| 日韩在线www| 国产成人精品免高潮费视频| 亚洲精品成人久久电影| 在线观看不卡av| 国产精品女视频| 久久久精品免费视频| 亚洲视频专区在线| 欧美日韩亚洲91| 狠狠久久五月精品中文字幕| 亚洲精品综合精品自拍| 国产亚洲综合久久| 成人妇女淫片aaaa视频| 亚洲男人7777| 91久久夜色精品国产网站| 欧美激情视频播放| 亚洲精品一区二区在线| 欧美电影免费观看| 国产精品久久77777| 国产精品久久久久99| 日韩久久精品成人| 久久精品国产一区二区三区| 国产日韩欧美夫妻视频在线观看| 国产精品自拍网| 欧美在线亚洲在线| 成人免费直播live| 亚洲xxxx视频| 亚洲自拍小视频免费观看| 欧美精品制服第一页| 中文字幕视频在线免费欧美日韩综合在线看| 午夜精品一区二区三区在线视| 欧美成人在线免费| 日韩激情av在线免费观看| 欧美激情欧美激情在线五月| 欧美裸体xxxx极品少妇| 亚洲欧洲在线观看| 欧美激情久久久| 久久精品2019中文字幕| 久久人人爽人人爽人人片av高请| 亚洲成人久久网| 国产精品直播网红| 久久综合网hezyo| 欧美激情网友自拍| 久久91亚洲精品中文字幕| 久久久视频免费观看| 日产日韩在线亚洲欧美| 亚洲精品动漫100p| 成人午夜高潮视频| 91性高湖久久久久久久久_久久99| 欧美老女人xx| 国产精品视频公开费视频| 亚洲视频综合网| 欧美肥婆姓交大片| 琪琪第一精品导航| 久久这里有精品视频| 国产精品久久婷婷六月丁香| 国产精品久久久91| 最近2019年中文视频免费在线观看| 国产精品美女午夜av| 成人伊人精品色xxxx视频| 国产精品久久久av| 亚洲国产私拍精品国模在线观看| 97超级碰碰碰久久久| 国产啪精品视频网站| 久久成人av网站| 欧美日韩精品在线观看| 欧美色欧美亚洲高清在线视频| 久久视频在线观看免费| 欧美精品在线网站| 成人免费午夜电影| 欧美夜福利tv在线| 欧美日韩加勒比精品一区| 亚洲国产精品人人爽夜夜爽| 久久99久久久久久久噜噜| 九九精品在线播放| 亚洲天堂av网| 欧美日韩一区免费| 国产精品久久久久久久9999| 亚洲电影免费观看高清完整版在线观看| 久久久久久国产| 97在线观看视频| 日韩成人在线网站| 国产精品扒开腿做爽爽爽男男| 国产成人福利视频| 日本老师69xxx| 国产精品久久久久久久9999| 91po在线观看91精品国产性色| 国产精品中文字幕久久久| 国产在线视频一区| 亚洲一区av在线播放| 欧美专区日韩视频| 亚洲性日韩精品一区二区| 欧美国产日韩免费| 亚洲二区中文字幕| 亚洲一区美女视频在线观看免费| 91色琪琪电影亚洲精品久久| 欧美性xxxx在线播放| 国产91色在线免费| 免费不卡在线观看av| 欧美精品九九久久| 色综合亚洲精品激情狠狠| 午夜精品久久久久久久99热| 插插插亚洲综合网| 国产精品久久久久久久美男| 亚洲欧美日韩在线高清直播| 国产精品老女人精品视频| 日韩一区二区三区国产| 日韩精品中文字幕在线| 欧美成年人视频| 成人免费在线网址| 国产一区二区三区视频在线观看| 国产+人+亚洲| 欧美一级电影免费在线观看| 国产啪精品视频网站| 欧美激情综合色| 亚洲欧美日韩精品久久| 欧美日韩国产一中文字不卡| 欧美自拍视频在线观看| 欧美精品videosex性欧美|