Java nio无阻塞客户机-服务器应用程序和自定义协议
我正在开发java.nio无阻塞客户机-服务器应用程序,该应用程序有一个非常简单的自定义协议,如下所示:Java nio无阻塞客户机-服务器应用程序和自定义协议,java,sockets,nio,nonblocking,custom-protocol,Java,Sockets,Nio,Nonblocking,Custom Protocol,我正在开发java.nio无阻塞客户机-服务器应用程序,该应用程序有一个非常简单的自定义协议,如下所示: MyApplcationProtocol: int lenpalcket; int filedone; String Description byte[] myBodyProtcol 身体的长度不是固定的 问题是,有时ByteBuffer中没有足够的字节,然后解码失败 while (myByteBuffer.hasRemaining()) { Utils.fillMyClass(my
MyApplcationProtocol:
int lenpalcket;
int filedone;
String Description
byte[] myBodyProtcol
身体的长度不是固定的
问题是,有时ByteBuffer中没有足够的字节,然后解码失败
while (myByteBuffer.hasRemaining()) {
Utils.fillMyClass(myclass,myByteBuffer);
public void fillMyClass(myclass,myByteBuffer){
myclass.filedone = myByteBuffer.getInt();
...
int bodyLen = myByteBuffer.getInt();
byte[] bodyByte = new byte[bodyLen];
myByteBuffer.get(bodyByte);
...
}
我必须等待下一个缓冲区完成对类的填充,因此我希望避免进入睡眠状态,因为它会阻塞线程。
有解决这个问题的模式/方法/链接/示例吗
我还尝试将“未读字节”存储在临时缓冲区中,但我不喜欢它,有时工作不正常
谢谢,非常感谢您的帮助身长不固定。你能想出最大的一包吗?我不久前在某个地方读到,您应该始终创建一个尽可能大的数据包作为缓冲区。它不是固定的/需要拆分以避免空字节,但您始终要确保有足够的空间容纳可能的最大数据包。您需要socket类中的上下文和状态。在非阻塞设计中,在TCP之上处理协议时,这是固有的。TBH,协议的逐字节状态机在每线程连接服务器中也不是一个坏主意。