繁体   English   中英

Java-套接字需要延迟才能接收正确的数据吗?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM