经过前面的系列文章,我们已经知道了netty的运行原理,同时也介绍了netty的基本服务构建流程和消息处理器的编写方法。今天这篇文章给大家介绍一个比较复杂的例子,文字聊天室。聊天室的工作流程今天我们来介绍一下文字聊天室。对于文字聊天室,我们首先需要建立一个服务器来处理各个客户端的连接。对于客户端来说,我们需要和服务器建立连接,然后向服务器发送聊天信息。服务器接收到聊天信息后,会响应消息并将消息返回给客户端,这样一个聊天室的过程就完成了。在上一篇文字处理器的文章中,我们提到过netty的传输只支持ByteBuf类型,不支持聊天室直接输入的字符串,需要对字符串进行编码和解码。我们之前介绍的encode类和decode类分别叫做ObjectDecoder和ObjectEncoder。今天介绍两个专门处理字符串的StringDecoder和StringEncoder。StringEncoder比ObjectEncoder要简单的多,因为对于一个对象,我们还需要在Byte数组的头部设置Byte数组的大小,这样才能保证正确读取到该对象的所有数据。对于String来说,比较简单,只需要保证一次读入的数据都是字符串即可。StringEncoder继承自MessageToMessageEncoder,其核心编码代码如下:}out.add(ByteBufUtil.encodeString(ctx.alloc(),CharBuffer.wrap(msg),字符集));从上面的代码可以看出,内核其实是调用了ByteBufUtil.encodeString方法将String转成ByteBuf。对于字符串编码,还需要定义一个编码范围。例如,我们需要知道一次需要编码多少个字符串。一般来说,我们使用回车来定义字符串输入的结束。Netty也提供了这样一个非常方便的类,叫做DelimiterBasedFrameDecoder。通过传入不同的Delimiter,我们可以将输入拆分成不同的Frames来处理一行字符串。newDelimiterBasedFrameDecoder(8192,Delimiters.lineDelimiter()))我再来看看StringDecoder的核心代码。StringDecoder继承自MessageToMessageDecoder:protectedvoiddecode(ChannelHandlerContextctx,ByteBufmsg,List