Netty是由JBOSS提供的一个java开源的、基于NIO的、异步的、事件驱动的网络应用程序框架和工具,用来快速开发高性能、高并发、高可靠的网络服务器和客户端程序,大多数用于服务端开发,为Java游戏服务器开发必学框架之一。
简单来说,Netty是一个基于NIO(No-block IO)的提供了对TCP、UDP、HTTP以及文件传输的支持,通过Reactor反应器模式,可以快速开发高性能的应用程序。
上一个简单的dome:
Server端
|
|
Client端:
|
|
Server端和Client端的代码都极其相似,主要是Server用了两个NioEventLoopGroup,一个用来接受client连接,一个用来进行对SocketChannel读写。ServerBootstrap用来启动NIO服务端的辅助启动类,目的是降低服务端的开发程度。简单说一下Channel和SocketChannel,常规的TCP通信是基于Socket的,然后同过字节流的方式进行传输,效率很低,在NIO中,通过Channel这种以块的模式进行传输数据,SocketChannel是Channel中的一种用以Socket传输的方式。
在netty中,不管是客户端还是服务端,一旦建立连接,首先初始化channel,通过new一个ChannelInitializer
在上边自定义ChannelHandlerAdapter的子类中,Server端中channelRead()方法是在接收到数据时运行,channelReadComplete()方法是在数据读取完成是运行,exceptionCaught是在发生异常是运行。Client不同的是
channelActive()方法是在连接成功后运行。其中发送数据都是ctx.writeAndFlush(ByteBuf),注意是发送字节,不能直接发送字符串,不然会发送不出去。
关于TCP粘包/拆包
简而言之,在网络传输中,数据是基于字节流的,一次最大能发送多少个字节的数据,跟操作系统有关以及硬件配置有关,发送的数据与数据之间是没有间隔的,是连接在一起的,会出现一次发送一条数据外加另一条数据的一部分等情况,那么怎么让客户端知道读取到某的地方时该是下一条数据,通常用\n或者\t\n来分辨,LineBasedFrameDecoder这个中间件就是通过\n和\t\n来区分。 DeLimitFrameDecoder则是以一个自定义的字符进行区分。
使用LineBasedFrameDecoder以及StringDecoder
Server:
|
|
Client:
注意使用LineBasedFrameDecoder后记得在发送的数据后边加\n,使用StringDecoder后,在channelRead方法里边的msg自动被转换成了字符串,但是发送数据时,仍然要发送字节流数据。