簡體   English   中英

如何在tcp套接字通信中讀取java中多種格式的inputstream

[英]How to read to inputstream in tcp socket communication for multiple formats in java

在基於TCP的通信中,我需要在DataInputStream上偵聽/讀取多種格式。 如write和writeUTF。

我需要確定另一端用來切換到該模式的模式,例如當使用writeUTF(String)時,我需要使用readUTF(),如果使用了write(byte []),那么我應該能夠切換讀取()以獲取數據。

我試圖使用markSupported,mark,reset但無法實現。 我打算先嗅探幾個字節以了解格式,然后再切換到必要的格式。

還請指定我是否可以使用任何其他輸入/輸出流進行tcp通信。

我對網絡通訊有基本的了解。 因此,對解決此問題的任何幫助將受到高度贊賞。 感謝您的幫助。

我不太確定您實際上要在這里實現什么。 您無法確定遠端使用的是哪種方法,因為一切都會解析為發送字節流。

因此,在最后,您將收到一個字節流,然后您必須確定它將代表什么。 您要識別的格式是什么? 你能列舉這些嗎? 您可以控制遠端發送它們的方式嗎? 如果是這樣,我將實現某種形式的標題,以便(例如)第一個字節標識類型(例如,字符串,數字數組等),然后您的客戶端可以適當地切換模式。

如果可以使用Java對象序列化和適當的對象流,則可以解析Java對象,然后使用instanceof例如

ObjectInputStream ois = new ObjectInputStream(is);
Object obj = ois.readObject();

if (obj instanceof String) {
   // do string-related stuff
}

等等。前提是您可以更改遠程端(盡管不確定!)

我建議看一下用於網絡通信的apache mina框架 Mina為您處理了大多數(如果不是全部)低層網絡功能。

代替DataInputStream,可以使用ObjectOutputStream進行寫入,並使用ObjectInputStream進行讀取。

您可以這樣寫:

    ObjectOutputStream objectOutputStream = new ObjectOutputStream(out);
    objectOutputStream.writeObject("xyz");

像這樣閱讀:

    ObjectInputStream objectInputStream = new ObjectInputStream(in);
    Object obj = objectInputStream.readObject();

您將遇到的問題是,您可以寫的任何內容都可以使用write()做UTF(),反之亦然。 如果不對可能發送的數據類型進行一些假設,就無法分辨出差異。 可以使它在某些特定情況下有效,但在一般情況下不起作用。

讀者無法可靠地知道write(byte [])寫入的長度。 您可能會發現在大多數情況下,read()會在環回中讀取相同的長度,但在實際網絡上將無法使用。

因此,發送方執行write(byte []),然后執行writeUTF(String)。 無法知道第一次寫入的時間,因此無法確定writeUTF何時開始(同樣,除非您對發送的數據類型進行假設)

解決您的問題的方法是發送一段數據的長度,然后發送其數據類型。 例如

將write(bytes)替換為writeInt(bytes.length),write((byte)1 / *字節* /),write(bytes)

writeUTF(bytes)替換為byte [] bytes = text.getBytes(“ UTF-8”); writeInt(bytes.length),write((byte)2 / * UTF * /),write(bytes)

這樣,接收者就可以知道消息的長度及其類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM