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

时间:2016-03-22 17:00:36

标签: java arrays sockets

我正在编写一个Java程序,使用套接字从C程序接收数据。

C程序mallocs一个整数数组,以适应要放入的元素数量。例如:{111,2,2,2,3,3}(111只是一个消息头),因此int []大小为6.(我们在发送完成后释放数组,返回值为0,是成功的)。我们打印出数组的内容,一切都按预期显示:111,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("");}

2 个答案:

答案 0 :(得分:0)

  

1)如果我在C中发送int数组并要求Java通过int读取int,它是否会影响Java?

当你要求Java用int读取它时,它基本上等待接下来的4个字节可用,并从这4个字节中构建int

看起来您的Java客户端在C服务器开始编写之前就开始读取数据 - 这就是为什么延迟2秒可以解决您的问题

您只需删除if(dataIn.available() > 0) { }条件 - dataIn.readInt()将阻止,直到数据在线上可用

答案 1 :(得分:0)

您正在分配并发送错误的长度。 msg_queue是一个指针,其大小与消息长度无关。 sizeof msg_queue应始终为sizeof int。您发送的数据太多,因此接收器不同步。

删除无意义的睡眠和available()测试。与睡眠不同,随后的读取将阻塞正确的时间长度。

您不需要清除动态消息即可将其释放。您甚至不需要动态分配消息,因为它的大小在编译时是已知的。