2013-04-16 100 views
2

我需要和處理這種情況,我已經閱讀了很多,我還沒有找到關於它的任何示例或文本。我有一個服務器套接字接收來自2個客戶端的數據:a)來自發送癟流的客戶端。 b)從發送ASCII流的客戶端發送。檢測輸入流是否收縮

a)接收癟流:

inflater = new InflaterInputStream(clientSocket.getInputStream()); 
bout = new ByteArrayOutputStream(3025); 
int b; 
while ((b = inflater.read()) != -1) { 
    bout.write(b); 
} 
strMessage = new String(bout.toByteArray()); 

B)從ASCII流接收:

bufferEnt = new char[3025]; 
Arrays.fill(bufferEnt,' '); 
input = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 
intLongBuffer = input.read(bufferEnt); 
strMessage = new String(bufferEnt).trim(); 

在每一個人的情況該代碼工作正常,並且變量strMessage具有正確的信息,但我需要確定什麼時候流是放氣的,什麼時候不流通,所以我可以將正確的一段代碼應用到每個案例,這是我的大問題!

+0

您是否控制客戶端?如果是,請添加一個表示流數據類型的標題值。 – jtahlborn

回答

0

可以讀取的字節到緩衝區中,然後嘗試誇大他們

InflaterInputStream iis = new InflaterInputStream(new ByteArrayInputStream(buf)); 
... 

,如果它不是一個泄了氣的流,你會得到一個異常,然後離開字節是

+0

,但可能會消耗流中的字節數 – jtahlborn

1

你可以將客戶端套接字輸入流包裝成BufferedInputStream,然後將緩衝流包裝到InflaterInputStream中,然後嘗試從inflater流中讀取數據。如果出現錯誤,則忘記inflater流,倒回緩衝流,然後直接從緩衝流中讀取。您必須使用緩衝流的mark()reset()函數來倒回流,並且您可能必須嘗試使用​​mark()來確定傳遞給它的值。類似以下內容:

BufferedInputStream bis = new BufferedInputStream(clientSocket.getInputStream()); 
bis.mark(1024); // experiment to find the correct value here 
InflaterInputStream iis = new InflaterInputStream(bis); 
try { 
    ... // Process the inflated stream 
} catch (ZipException ze) { 
    // It is not a ZIP stream. Try to process as text 
    bis.reset(); 
    ... // Process the text stream 
} 
+0

非常感謝Kenster,此解決方案完美無缺。 – user2286970