2016-03-22 34 views
0

我正在编写一个使用套接字从C程序接收数据的Java程序。Java - 套接字需要延迟才能接收正确的数据?

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

你能分享C代码吗? – bedrin

+0

@bedrin确定更新! –

+1

我不擅长C,但我认为'sizeof msg_queue'是指针的大小,而不是int的大小。不是吗?在这种情况下,当我尝试执行printf(“%d,%d”,count,sizeof msg_queue)时,它可能是8而不是4 – bedrin

回答

0

1)是否影响Java的,如果我用C发送int数组,并要求通过Java的INT读INT?

当你问Java int的形式通过INT读它,它基本上是等待可用接下来的4个字节,并建立一个int值这些4个字节

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

你可以简单地删除if(dataIn.available() > 0) { }条件 - dataIn.readInt()将阻塞,直到数据可用在电线

+0

我对此也很怀疑,这就是为什么我们把111作为标题,然后我们尝试处理接下来的5个整数,但不幸的是它没有像中间/结尾那样工作值会随机丢失 –

+0

我们尝试删除dataIn.available()> 0,并且我们得到的结果如下所示:未知:6未知:0未知:0未知:0未知:2未知:3 –

0

你allocati并发送错误的长度。 msg_queue是一个指针,它的大小与消息长度无关。 sizeof msg_queue应始终为sizeof int。你发送的数据太多,所以接收机不同步。

删除无意义的睡眠和available()测试。与你的睡眠不同,随后的阅读将会阻止正确的时间。

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

+0

嗨我已根据您的建议更新了我的主要帖子中的解决方案,但问题仍然存在,没有500毫秒的睡眠时间。任何想法在Java方面发生了什么,或者它是C程序仍然错? –

+0

我没有兴趣,直到你摆脱了睡眠和'可用()'测试根据我的答案。 – EJP