2014-09-29 27 views
0

整數。在我的應用程序,客戶端發送文件,這種格式的服務器,如何驗證從套接字流收到的Java

4 bytes of file length + actual file content 

因此,服務器將讀取前4個字節來獲得消息的長度和那麼它讀取消息的長度。

服務器的代碼會是這樣,

ByteArrayOutputStream lengthBuf = new ByteArrayOutputStream(4); 
byte[] output = new byte[4]; 

//Reading first 4 bytes from InputStream 
int readLength = inputStream.read(output); 
lengthBuf.write(outpu, 0, readLength); 

//Converting to integer 
int length = ByteBuffer.wrap(lengthBuf.toByteArray()).getInt(); 

它工作正常的情況下有效。但是如果客戶端無法在前4個字節中追加長度,那麼這個長度會得到一些垃圾值(1481988969)。如何驗證前4個字節的數據是一個有效的整數?

+0

你試過了output.getInt();重建前四個? – danielad 2014-09-29 13:29:38

+1

如果inputStream.read()讀取少於4個字節會怎麼樣?如果排序錯誤會發生什麼? – 2014-09-29 13:30:39

+0

順便說一句'Integer'!='int' – 2014-09-29 13:32:41

回答

0

爲什麼不;噸您至少有大小四個,那麼,當客戶端無法追加尺寸initalize它>

if(length==null) { 

    size = 4 ; 

} 
ByteArrayOutputStream lengthBuf = new ByteArrayOutputStream(size); 

int length = ByteBuffer.wrap(lengthBuf.toByteArray()).getInt(); 
+0

對不起,我沒有得到你的意思。 – Prabu 2014-09-29 13:54:18

1

我會做這種方式。

DataInputStream dis = new DataInputStream(inputStream); 
int len = dis.readInt(); // read exactly 4 bytes 
byte[] bytes = new byte[len]; 
dis.readFully(bytes); 

當您第一次閱讀時,您可能會少於4個字節。當你閱讀實際的數據時,你可能需要多次閱讀以獲取全部內容。 read(byte[])可以返回一個或多個字節。

+0

你怎麼說在第一次讀取時我會少於4個字節(我的意思是readInt())?我嘗試使用DataInputStream.readInt()在我的情況。它返回隨機垃圾值。 – Prabu 2014-09-29 13:50:27

+0

@Prabu我在說你可以讀取小於4.是4字節的'int'值是以小字還是大字節格式發送。 DataInputStream採用大端或網絡格式,但大多數C/C++程序默認使用小端。 (實際上,這取決於它運行的機器而變化) – 2014-09-29 13:51:59

+0

客戶端發送32位長的大端(或網絡順序),並使用pack(「N a *」,len,buf)寫入perl。 – Prabu 2014-09-29 14:02:01

2

只要固定爲4個字節,整數的所有值都可以有效,就沒有辦法。 但是,如果你可以更多的字節。您可以添加第五個字節,例如使用CRC或其他錯誤檢測代碼來檢查值是否已正確傳輸。

另一種選擇是,如果你實際上不需要四個傳輸字節的所有位,那麼你使用它們中的一些位。

兩者實際上都需要訪問服務器實現的套接字。如果您沒有此訪​​問權限,則無法檢查整數是否正確。您只能排除您知道它們從不發生的文件大小。例如:

if (integer < MAX_FILE_SIZE and integer > 0) valid(); 
// or integer >= 0 if empty files are allowed. 
else invalid(); 
+0

這就是我最後通過與一些最大值進行比較而計劃要做的事情。我無法修改客戶端代碼以添加額外的字節。 – Prabu 2014-09-29 13:53:50

+0

然後我沒有看到任何其他機會來檢查收到的值是否正確。也許你可以發送請求兩次,並檢查兩個結果是否給你相同的值。 – 2014-09-29 13:57:04