现在Java网络编程框架这块基本已经被Netty垄断了,几乎所有框架底层的RPC通信都是使用Netty来实现,Netty是一个高性能的异步通信框架,采用Java的NIO编写,它屏蔽了NIO的一些晦涩的编程模式,使NIO编程变得更加容易。
我们首先来写一个简单的Helloworld作为Netty的入门,我们会对主要的代码做一些简单的解释,等以后再来详细每个组件的使用。
服务端
首先来编写服务端的代码。
第14,15行的NioEventLoopGroup是一个NIO多线程IO处理器,这里一共用到了2个EventLoopGroup,第一个称作boss,接受即将来临的连接,第二个称作worker,在boss接受连接并将接受的连接注册到worker之后,处理连接上的的通信请求。
第17行的ServerBootstrap是用于创建服务端的辅助类,用于设置连接参数,EventLoopGroup,Handler等。
第22行的ChannelInitializer用于帮助用户配置channel,我们可以方便的在上面添加多个channelHandler,在相应的channelHandler完成我们对消息的处理。
第28行则是启动服务端并将其绑定在8080端口
服务端的消息处理流程则是在25行的TestServerHandler中完成。我们来看TestServerHandler的代码
首先继承ChannelInboundHanderAdaper,重写channelRead方法,该方法在channel中有数据来临时被调用,我们使用ByteBuf来进行消息读取与发送(ByteBuf是JDK中ByteBuff的升级版),发送完消息后释放掉msg的引用。
总结一下我们这个简易服务端的处理流程:接受到来自客户端的消息并打印,然后返回给客户端一个“response”字符串。
服务端的代码到此就已经全部完成了,接下来是客户端的代码。
客户端
第15行因为客户端不需要处理来自其他客户端的连接,所以不需要boss EventLoopGroup,只需要一个work EventLoopGroup即可
第17行的Bootstrap类似于服务端的ServerBootstrap是用于创建客户端的辅助类。
第24行是添加客户端处理逻辑的Handler
第28行指定host与端口连接到对应得服务端。
来看TestClientHandler的代码。
同样继承ChannelInboundHandlerAdapter,只不过客户端多重写了一个channelActive方法,该方法在channel激活时被调用,即一连接上服务端时就调用该方法,相当于客户端的初始化方法,这里在方法向服务端发送了一个“hello”。在channelRead方法中接受来自服务端的消息并将其打印。
服务端与客户端的代码都已经开发完了,接下来分别启动它们,查看结果。
运行
首先启动服务端,然后是客户端,查看控制台。
可以看到服务端接受到了客户端发来的“hello”。
客户端接受到了来自服务端的响应“response”
至此,一个简单的Netty HelloWorld就已经完成了,如果了解过Java NIO的同学应该可以对比出来,使用Netty大大节省了我们的工作量,而且代码逻辑更加清晰,代码整洁度更高。由于只是一个入门示例,还有很多的知识点没有涉及,比如TCP/IP的拆包与粘包,心跳机制等,在以后的文章在详细介绍,也会更加深入的介绍上面提到的一些组件(EventLoopGroup等)。
至此,敬礼。