unity 客户端
public void WriteString(string v) {
byte[] bytes = Encoding.UTF8.GetBytes(v);
Debug.Log("bytes.Length" + bytes.Length);
Debug.Log(BitConverter.ToString(bytes));
//byte[] bs = BitConverter.GetBytes(bytes.Length);
// Array.Reverse(bs);
for (int i = 0; i < 10; i++)
{
writer.Write(bytes.Length);
writer.Write(bytes);
}
}
netty服务器端
public class MessageDecoder extends ByteToMessageDecoder {
public static final Logger _logger = Logger.getLogger(MessageDecoder.class);
private static final Charset charset = Charset.forName("UTF-8");
private static int i =0;
@Override
protected void decode(ChannelHandlerContext ctx, ByteBuf in,
List<Object> list) throws Exception {
if(in.readableBytes() < 6) {
return;
}
_logger.info(in.readableBytes());
byte[] b = new byte[4];
b[3] = in.readByte();
b[2] = in.readByte();
b[1] = in.readByte();
b[0] = in.readByte();
_logger.info(CommonUtils.byteArrayToInt(b));
in.resetReaderIndex();
//第一次多了两个byte
_logger.info(in.readByte());
_logger.info(in.readByte());
b = new byte[4];
b[3] = in.readByte();
b[2] = in.readByte();
b[1] = in.readByte();
b[0] = in.readByte();
//获取实际数据长度
int msgLength = CommonUtils.byteArrayToInt(b);
_logger.info(msgLength);
//如果可读数据长度小于包头给的的长度,则重置读取的位置
if(in.readableBytes() >= msgLength) {
//读取数据
byte[] data = new byte[msgLength];
in.readBytes(data);
//byte转换成String
ByteBuffer bb = ByteBuffer.wrap(data);
StringBuffer buffer = new StringBuffer();
buffer.append(charset.decode(bb));
//_logger.info("msg:" + buffer.toString());
list.add(buffer.toString());
i++;
in.discardReadBytes();
_logger.info("接受" + i + "次消息");
} else {
in.resetReaderIndex();
}
}
连续发送数据包,解析的时候,第一次,前面多了两个byte,后面不会,导致,第一次可以正常解析,后面判断数据包长度都无法正确获取,这个是什么问题呢
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。