激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|JavaScript|易語言|

服務器之家 - 編程語言 - JAVA教程 - Java NIO框架Netty簡單使用的示例

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

2021-03-13 11:40anxpp JAVA教程

本篇文章主要介紹了Java NIO框架Netty簡單使用的示例,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

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

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

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

1、服務端

Server:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
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:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
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:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
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、用于計算的工具類

?
1
2
3
4
5
6
7
8
9
10
11
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
2
3
4
5
6
7
8
9
1+5+5+5+5+5
客戶端發送消息:1+5+5+5+5+5
服務器消息:26
156158*458918+125615
客戶端發送消息:156158*458918+125615
服務器消息:7.1663842659E10
1895612+555+5+5+5+5+5+5+5-5*4/4
客戶端發送消息:1895612+555+5+5+5+5+5+5+5-5*4/4
服務器消息:1896197

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

查看服務端控制臺:

?
1
2
3
4
服務器開啟: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相關內容,直到一個簡陋的通訊服務器完成。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:http://blog.csdn.net/anxpp/article/details/52108238

延伸 · 閱讀

精彩推薦
  • JAVA教程spring boot 配置Filter過濾器的方法

    spring boot 配置Filter過濾器的方法

    本篇文章主要介紹了spring boot 配置Filter過濾器的方法,實例分析了spring boot 配置Filter過濾器的技巧,有興趣的可以了解一下。...

    小布的世界4992020-09-02
  • JAVA教程Java經典排序算法之二分插入排序詳解

    Java經典排序算法之二分插入排序詳解

    這篇文章主要為大家詳細介紹了Java經典排序算法之二分插入排序,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    歐陽鵬3982020-09-06
  • JAVA教程Java 線程池_動力節點Java學院整理

    Java 線程池_動力節點Java學院整理

    系統啟動一個新線程的成本是比較高的,因為它涉及到與操作系統的交互。在這種情況下,使用線程池可以很好的提供性能,尤其是當程序中需要創建大量...

    動力節點1862020-10-30
  • JAVA教程深入理解java中的重載和覆蓋

    深入理解java中的重載和覆蓋

    下面小編就為大家帶來一篇深入理解java中的重載和覆蓋。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧 ...

    jingxian3062020-05-21
  • JAVA教程IntelliJ Plugin 開發之添加第三方jar的示例代碼

    IntelliJ Plugin 開發之添加第三方jar的示例代碼

    這篇文章主要介紹了IntelliJ Plugin 開發之添加第三方jar的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需...

    android阿杜4142020-09-12
  • JAVA教程Springboot如何實現自定義異常數據

    Springboot如何實現自定義異常數據

    這篇文章主要介紹了Springboot如何實現自定義異常數據,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以...

    鼓搗貓膩2162020-09-02
  • JAVA教程java用兩個例子充分闡述多態的可拓展性介紹

    java用兩個例子充分闡述多態的可拓展性介紹

    下面小編就為大家帶來一篇java用兩個例子充分闡述多態的可拓展性介紹。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看...

    jingxian4752020-05-16
  • JAVA教程Java中Spring獲取bean方法小結

    Java中Spring獲取bean方法小結

    Spring是一個輕量級的控制反轉(IoC)和面向切面(AOP)的容器框架,如何在程序中獲取Spring配置的bean呢?下面通過本文給大家介紹Java中Spring獲取bean方法小...

    mrr4972020-03-21
主站蜘蛛池模板: 亚洲成人免费视频在线 | 国产女做a爱免费视频 | 国产精品久久在线观看 | 黄色av一区二区三区 | 99精品视频久久精品视频 | 久久骚| 欧美日韩中文字幕在线视频 | 久久久久久久久久综合 | 亚洲狠狠入 | 亚洲精品久久久久久下一站 | 欧美精品一区自拍a毛片在线视频 | 成人午夜在线免费观看 | 久久久看 | 国产免费大片视频 | 久久蜜桃香蕉精品一区二区三区 | 久久久免费| 一级在线观看视频 | 韩国十九禁高潮床戏在线观看 | 亚洲成人网一区 | 毛片毛片免费看 | 九九福利视频 | avlululu | 成人免费网站在线观看 | 国产精品免费视频观看 | 国产精品亚洲激情 | 九九黄色 | 精品国产久 | 欧美精品成人一区二区三区四区 | 亚洲极色 | 日本爽快片100色毛片视频 | 色欲香天天天综合网站 | 九草在线 | 长泽雅美av | 国产成人精品一区二区视频免费 | 原来神马影院手机版免费 | 国产成人精品免费视频大全最热 | 国产女同疯狂激烈互摸 | 亚洲综合无码一区二区 | 国产精品一区二区日韩 | 91精品国产免费久久 | 天天撸日日夜夜 |