[英]Java - Socket needs delay to receive correct data?
我正在编写使用套接字从C程序接收数据的Java程序。
C程序m分配一个整数数组以适合要放入其中的元素数。 例如:{111,2,2,2,3,3}(111只是消息头),因此int []的大小为6。(发送完成后,返回值为0,则释放数组。是成功)。 我们打印出数组的内容,所有内容均按预期显示:11、2、2、2、3、3
但是,我们意识到在Java中,我们需要在从输入流读取之前添加一个较小的延迟,否则我们将无法获得正确的值。 例如,如果我们没有在输入流可用之前放置Thread.sleep(2000),则Java接收的值将类似于111,0,0,0,3,3(例如,值2丢失)
1)如果我在C中发送int数组并要求Java通过int读取int,是否会影响Java?
2)为什么延迟会使数据准确? 我们尝试使用1000,1500,但只有2000可以提供最稳定的结果
3)如果在SomeAction.class中,我则忙于等待:
while (!pcClient.readMessage());
要么
while (!pcClient.readMessage()) {}
它只会进入一次while循环,然后爆发? 而如果我在下面这样做,它将按预期工作:
while (!pcClient.readMessage()) {System.out.print("");}
1)如果我在C中发送int数组并要求Java通过int读取int,是否会影响Java?
当您要求Java逐int读取int时,它基本上等待下一个4个字节可用,并从这4个字节中构建一个int
值
看来您的Java客户端在C服务器开始写入数据之前就开始读取数据-这就是为什么需要2秒的延迟才能解决您的问题
您可以简单地删除if(dataIn.available() > 0) { }
条件dataIn.readInt()
将阻塞,直到网络上的数据可用为止
您正在分配和发送错误的长度。 msg_queue
是一个指针,其大小与消息长度无关。 自始至终, sizeof msg_queue
应为sizeof int
。 您发送的数据过多,因此接收器不同步。
删除无意义的睡眠和available()
测试。 与您的睡眠不同,后续的读取将在正确的时间长度内阻塞。
您无需清除动态消息即可释放它。 您甚至不需要动态分配消息,因为在编译时就知道消息的大小。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.