在socket传输通信中容易丢包问题,什么半包问题,这些都是很正常的问题,处理方法就是定义自己的编解码规则了,让每次接收按定义好的规则为一个完整包作为数据源即可。
下面个例子就是netty自定义的一个解码器:
1 import io.netty.buffer.ByteBuf;
2 import io.netty.buffer.ByteBufAllocator;
3 import io.netty.channel.ChannelHandlerContext;
4 import io.netty.handler.codec.ByteToMessageDecoder;
5 import java.util.List;
6
7 public class XmlDecoder extends ByteToMessageDecoder {
8
9 String lastStr = "";
10
11 @Override
12 protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
13 System.out.println("解码器:");
14 int len = in.readableBytes();
15 if (len < 1) return;
16 byte[] bytes = new byte[len];
17 in.getBytes(0, bytes);
18 String temp = new String(bytes);
19 //这里为XML结束标签,自行替换
20 int index = temp.indexOf("</body>");
21 if (index == -1) {
22 lastStr += temp;
23 } else {
24 lastStr += temp.substring(0, index+14 );
25 ByteBuf buffer = ByteBufAllocator.DEFAULT.buffer();
26 buffer.writeBytes(lastStr.getBytes());
27 out.add(buffer);
28 lastStr = "";
29 }
30 in.skipBytes(len);
31 }
32
33 }