【Netty4 简单项目实践】二、解决TCP连包问题:分隔符解码器
2016-04-25 18:44
375 查看
TCP他会分包发很讨厌,开始的时候用分隔符来实现String消息的提取。
这种解决方案适合于用Json进行消息交互的TCP长连接。
下面的代码,在第一篇的代码上进行修改即可。
记得ByteBuff要释放掉,在finally代码中调用:
上面的处理类 ByteStreamHandler.java
这种解决方案适合于用Json进行消息交互的TCP长连接。
下面的代码,在第一篇的代码上进行修改即可。
分隔符处理器
解决的思路是在channel链上加载分隔符处理器DelimiterBasedFrameDecoder,代码如下String delimiter = "Doge"; ByteBuf[] delimiterBytes = new ByteBuf[] { Unpooled.wrappedBuffer(delimiter.getBytes()) }; // 这里省略十几行代码 bootstrap.localAddress(new InetSocketAddress(port)) .childHandler(new ChannelInitializer<Channel>() { @Override protected void initChannel(Channel ch) throws Exception { // TODO Auto-generated method stub ch.pipeline().addLast("framer",new DelimiterBasedFrameDecoder( 4096, delimiterBytes));// 这里,看这里 ch.pipeline().addLast(new StringDecoder()); ch.pipeline().addLast(new StringEncoder()); ch.pipeline().addLast(new ByteStreamHandler()); } });
记得ByteBuff要释放掉,在finally代码中调用:
for (inti=0; i<delimiterBytes.length;i++){ delimiterBytes[i].release(); }
上面的处理类 ByteStreamHandler.java
public class ByteStreamHandler extends SimpleChannelInboundHandler<String>{ private StringBuffer sb = new StringBuffer(); @Override protected void channelRead0(ChannelHandlerContextctx, String msg)throws Exception { // TODO Auto-generated method stub sb.append(msg); } @Override public void channelReadComplete(ChannelHandlerContextctx) throws Exception { System.out.println(sb.toString()); } }
相关文章推荐
- Java反射使用实例(http实体类转换)
- Android开发本地及网络Mp3音乐播放器(七)循环模式与专辑倒影
- Android开发本地及网络Mp3音乐播放器(七)循环模式与专辑倒影
- 理解TIME_WAIT,彻底弄清解决TCP: time wait bucket table overflow
- TCP IP网络编程2 简单的Web服务器
- XMLHTTPRequest笔记
- android中使用线程池和临时缓存优化网络图片加载
- 网络请求数据
- 网络层(1)
- C#基于TCP协议的服务器端和客户端通信编程的基础教程
- android通过执行netstat及cat /proc/net/tcp查看正在运行应用的本地端口号pid和uid以及对方的IP和端口号
- XMLHttpRequest
- android httpClient(https/http)的优化构建方式二
- 在Activity中开启一个线程执行网络操作出现的问题
- HTTP协议里的cookie和session
- 远程调试没配网络的电脑
- HTTP协议的状态码
- 远程调试没配网络的电脑
- android httpClient(https/http)的优化构建方式一
- 网络请求数据缓存