现在使用NIO,有个问题每次客户端发送请求来,最前面的四个字节是长度,一般长度77\79\101
然后程序会判断长度是否为java.nio.ByteBuffer.position一致,一致才进行业务处理
但是现在客户端发送过来 5000 个字节,但是每次请求的数据只有 1000 个字节,这说明客户端发送太快,或是服务器处理太慢,系统把这5次的请求的数据加到一起了.
这个时候我要怎么分批处理?请大家贴下代码?
------解决方案--------------------
写自定义的网络协议时,最重要的一点是要考虑消息的粘包问题.
在套接字上接收到的的都是字节,你怎么分清这个字节属于上消息还是下个消息?
你可以这样做,定义一个消息头,比如连续的-1字节就表示一个新的消息开始,后面跟4个字节的消息长度,后面就是一直读到有这么多字节就表示一个消息读取成功了.
头标记 + 4字节的消息长度 + 消息正文
------解决方案--------------------
例如每次发送前判断客户端超过多少字节不给发送
------解决方案--------------------
拆分下字节,然后组合字节,可以参考下
ByteBuffer[] bb = new ByteBuffer[1024];
ByteBuffer[] bb1 = Arrays.copyOf(bb, 0);
ByteBuffer[] bb2 = Arrays.copyOf(bb, 0);
ByteBuffer[] bb3 = new ByteBuffer[bb1.length + bb2.length];
System.arraycopy(bb1, 0, bb3, 0, bb1.length);
System.arraycopy(bb2, 0, bb3, bb1.length, bb2.length);