Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java nio无阻塞客户机-服务器应用程序和自定义协议_Java_Sockets_Nio_Nonblocking_Custom Protocol - Fatal编程技术网

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

我正在开发java.nio无阻塞客户机-服务器应用程序,该应用程序有一个非常简单的自定义协议,如下所示:

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,协议的逐字节状态机在每线程连接服务器中也不是一个坏主意。