2009-10-31 62 views
0

在從套接字讀取數據期間,我遇到了一些問題如果套接字流中存在一些空數據,因此DataInputStream不會讀取完整的數據,並且在接收端也有解析數據的異常。 什麼是從套接字讀取數據的正確方法,因此在任何時候都不會丟失數據? 在此先感謝。從套接字讀取數據的問題

回答

2

你應該張貼被用於從套接字讀取的代碼,但對我來說最有可能的情況是,識別代碼被錯誤地解釋爲0字節作爲流的類似下面的代碼

InputStream is = ...; 
int val = is.read(); 
while (0 != (val = is.read()) { 
    // do something 
} 
結束

但流指標的最後居然是-1

InputStream is = ...; 
int val = is.read(); 
while (-1 != (val = is.read()) { 
    // do something 
} 

編輯:在回答關於使用isavailable()您的評論。我假設你的意思是available(),因爲isavailable() InputStream上沒有方法。如果您使用可用來檢測流的結束,那也是錯誤的。該函數僅告訴您可以不阻塞地讀取多少個字節(即,當前有多少個字節在緩衝區中),而不是流中剩下多少個字節。

+0

我使用isavailable和我讀了整個數據 – Sam97305421562 2009-10-31 07:40:09

+1

OK,所以職位的代碼,或者可以複製該問題的代碼的一個小例子。我說我猜測,沒有看到代碼就無法確定。 – Jherico 2009-10-31 16:35:21

0

我個人比DataInputStream更喜歡ObjectInputStream,因爲它可以處理所有類型,包括字符串,數組,甚至是對象。

是的,您可以只讀取整行1行receive.readObject(),但不要忘記對返回的對象進行類型轉換。

read()可能會更容易,因爲您在1行中讀取整個事件,但不準確。通過一個讀取的數據之一,是這樣的:

receive.readBoolean() 
receive.readInt() 
receive.readChar() 
etc.. 
0
String finalString = new String(""); 
int finalSize = remainingData;//sizeOfDataN; 
int reclen = 0; 
int count_for_breaking_loop_for_reading_data = 0; 
boolean for_parsing_data = true; 
while(allDataReceived == false) {  
ByteBuffer databuff = ByteBuffer.allocate(dis.available()); 
// System.out.println("bis.availbale is "+dis.available()); 
databuff.clear(); 
databuff.flip(); 
dis.read(databuff.array()); 
String receivedStringN = trimNull(databuff.array()); 
finalString = finalString + receivedStringN; 
System.out.println("final string length "+finalString.length()); 
if(finalString.length() == finalSize) { 
    allDataReceived = true; 
} 
count_for_breaking_loop_for_reading_data++; 
if(count_for_breaking_loop_for_reading_data > 1500) { 
For_parsing_data = false; 
Break; 
} 
}