gpt4 book ai didi

Java NIO框架Netty简单使用的示例

转载 作者:qq735679552 更新时间:2022-09-27 22:32:09 24 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章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 NIO框架Netty简单使用的示例的文章就讲到这里了,如果你想了解更多关于Java NIO框架Netty简单使用的示例的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com