最近做项目遇到一个问题,就是netty开发程序,客户端发送0518xxxx(后面518个数据),然后发送给服务端,服务端的解码器是自己写的,大概意思就是读取长度,再根据长度去截取,不够长度时累计到下次读取,我发现这个方法单线程没有问题,多线程或出现数据错乱的问题呢,请问大家这个问题要怎么解决。以下是我服务端的解码器:
public class MsgDecoder extends FrameDecoder {
@Override
protected Object decode(ChannelHandlerContext ctx, Channel channel,
ChannelBuffer buf) throws Exception {
if (buf.readableBytes() < 4) {
return null;
}
buf.markReaderIndex();
byte[] headBytes = new byte[4];
buf.readBytes(headBytes);
String lenStr = new String(headBytes, "gbk");
int length = Integer.parseInt(lenStr);
if (length < 4 || length > maxFrameLength) {
throw new RuntimeException("Bad message length: " + length);
}
if (buf.readableBytes() < length) {
buf.resetReaderIndex();
System.out.println("长度不够");
return null;
}
ChannelBuffer frame = buf.readBytes(length);
String msgStr = frame.toString(Charset.forName("gbk"));
//System.out.println("decoder:"+msgStr);
return msgStr;
}
}
感觉和线程没有关系! 本质上没有好处理数据粘包。 直接用 int toString 这个不科学。0000-9999的数字。 后面readByte(99) 这样就可以返回对应长度的数据了吗? buf.readableBytes()
手机端不能使用 < 符号呀,。后面的内容都被替换掉了
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。