世界上并没有完美的程序,但是我们并不因此而沮丧,因为写程序就是一个不断追求完美的过程。
TCP以字节流的形式进行传输,所以请求之间没有分隔,因此要获取准确的请求,需要解决请求的分段。
在这里不做其他讨论,只是提供一个亲测可行的解决方案。
Server 和 Client 的Initializer中添加如下编解码器:
channel.pipeline().addLast(new StringEncoder(Charset.forName("utf8")));
channel.pipeline().addLast(new LineBasedFrameDecoder(Integer.MAX_VALUE));
channel.pipeline().addLast(new StringDecoder(Charset.forName("utf8")));
有一点,注意顺序,因为是职责链的调用模式,LineBasedFrameDecoder 一定在 StringDecoder 之前。
写入数据时:
public void wt(ChannelHandlerContext ctx, String re) {
re += "\n";
ctx.writeAndFlush(re);
}
LineBasedFrameDecoder 是根据字符串末尾的 “\n” 或 “\r” 判断是否同一请求的,所以每个请求写入都以 “\n” 结尾,并且写入的字符串中不能含有这两个转义字符。
读取数据:
public String rd(Object msg) {
return (String) msg;
}