2016-03-22 38 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