2011-07-25 86 views
1

我正在編程一個服務器(Java) - 客戶端(Android/Java)應用程序。該服務器是一個W7。所有的溝通都進行得很順利,直到客戶端讀取數據時才凍結並停止讀取數據,直到我發送數據2次。Java套接字不讀取數據

未讀取的數據是一個字節數組。我重複一遍,直到這一點,所有的溝通都順利進行。

下面是我用於發送數據的代碼:

Long lLength = new Long(length); 
byte [] bLength = this.longToBytes(lLength.longValue()); 
dos.write(bLength); 
dos.flush(); 

dos.write(bLength); 
dos.flush(); 

dos.write(bLength); 
dos.flush(); 

該代碼轉換長值轉換成8個字節數組。正如我所說的,當第一次寫入被執行(並且客戶端正在等待數據)時,讀取沒有完成。直到我執行最後一次寫入()時才完成。

而這裏的代碼來閱讀:

byte length[] = {0,0,0,0,0,0,0,0}; 
dis.read(length); 

我使用Wireshark的嗅探流量,我可以看到字節數組發送,並以ACK客戶端的答案,但閱讀沒有完成。

Here我已經上傳了我用wireshark完成的捕獲。只有協議數據。

在客戶端和服務器,插座都設置這樣的:

socket = new Socket(sIP, oiPort.intValue()); 
dos = new DataOutputStream(socket.getOutputStream()); 
dis = new DataInputStream(socket.getInputStream()); 

這是推動我瘋了...我不知道爲什麼,在某一時刻,應用程序停止讀取數據,當我以同樣的方式發送它。

我想,這個問題可能在客戶端套接字的輸入緩衝器...但我不知道該怎麼做或什麼嘗試...

說,我也考服務器在WXPSP3,它仍然無法正常工作。

非常感謝,

Newlog。

回答

1

我首先要看的是您的longToBytes方法的代碼。它真的創建了一個8字節的字節數組?如果它正在生成一個少於8個字節的數組,那麼這就解釋了這個問題。 (您的客戶預計8字節,並將阻止,直到它們全部到達。)

接下來,我會問自己的是我爲什麼不只是使用writeLongreadLong。它會簡化你的代碼,並且很可能解決這個問題。

+0

你好,斯蒂芬。我已經檢查了你所說的。使用Wireshark,我可以看到8個字節被髮送。我不使用writeLong,因爲在寫入時,客戶端沒有讀取數據。 (起初它是一個writeLong)。 – newlog