国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > Java > 正文

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

2024-07-13 10:15:42
字體:
供稿:網(wǎng)友

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

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

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

1、服務(wù)端

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("服務(wù)器開啟:"+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 = "錯誤的表達(dá)式:" + 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 = "錯誤的表達(dá)式:" + 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鏈路簡歷成功后調(diào)用    */   @Override   public void channelActive(ChannelHandlerContext ctx) throws Exception {     this.ctx = ctx;   }   public boolean sendMsg(String msg){     System.out.println("客戶端發(fā)送消息:"+msg);     byte[] req = msg.getBytes();     ByteBuf m = Unpooled.buffer(req.length);     m.writeBytes(req);     ctx.writeAndFlush(m);     return msg.equals("q")?false:true;   }   /**    * 收到服務(wù)器消息后調(diào)用    * @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("服務(wù)器消息:"+body);   }   /**    * 發(fā)生異常時調(diào)用    */   @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、測試

分別啟動服務(wù)端和客戶端,然后再客戶端控制臺輸入表達(dá)式:

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

可以看到服務(wù)端返回的結(jié)果。

查看服務(wù)端控制臺:

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

5、更多

相關(guān)文章:

 Java 網(wǎng)絡(luò)IO編程總結(jié)(BIO、NIO、AIO均含完整實例代碼)

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

后續(xù)會繼續(xù)更新Netty相關(guān)內(nèi)容,直到一個簡陋的通訊服務(wù)器完成。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持VeVb武林網(wǎng)。


注:相關(guān)教程知識閱讀請移步到JAVA教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 博客| 湛江市| 澄城县| 龙山县| 图木舒克市| 莱西市| 婺源县| 普兰店市| 凤冈县| 湄潭县| 武城县| 揭东县| 蕉岭县| 莒南县| 邹平县| 兴化市| 大同县| 施秉县| 东台市| 正宁县| 安福县| 新竹县| 菏泽市| 稻城县| 梅河口市| 南丹县| 浮山县| 溧水县| 泗洪县| 新绛县| 商洛市| 桐庐县| 通化市| 宜章县| 赤壁市| 中卫市| 壶关县| 西藏| 若羌县| 溧阳市| 平利县|