我正在编写一个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("");}
答案 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()
测试。与睡眠不同,随后的读取将阻塞正确的时间长度。
您不需要清除动态消息即可将其释放。您甚至不需要动态分配消息,因为它的大小在编译时是已知的。