2011-04-06 38 views
2

我寫一個插座客戶端,其中我送(使用的getOutputStream())的數據到服務器,下面是我的代碼java.io.StreamCorruptedException:無效流頭

this.wr = this.socket.getOutputStream(); 

    wr.write(hexStringToByteArray(messageBody)); 

wr.flush(); 

以上是全成能夠發送數據。 1),但是當我嘗試使用

this.in = new ObjectInputStream(this.socket.getInputStream()); 

因爲我不知道該服務器返回什麼格式來讀取響應。在此行發生錯誤

「java.io.StreamCorruptedException:invalid stream header」。

我不知道爲什麼?我知道我會收到的價值將在十六進制格式,即 說600185將如在60 01 86 ....

任何人都可以請幫助我,來過來這個錯誤。

2)同樣如果我沒有收到任何響應後一段時間,如何關閉套接字連接。

感謝大家提前。

回答

5

ObjectInputStream需要由ObjectOutputStream寫入的流中的頭。所以如果你使用一個,你需要使用兩者。

由於您的示例並不真的需要ObjectOutputStream,因此您可能只是不想使用ObjectInputStream。

類似:

public void doWrite(Socket socket, String messageBody) { 
    DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); 
    byte[] data = hexStringToByteArray(messageBody); 

    dos.writeInt(data.length); 
    dos.write(data); 
    dos.flush(); 
} 

public String doRead(Socket socket) throws IOException { 
    DataInputStream dis = new DataInputStream(socket.getInputStream()); 
    int len = dis.readInt(); 
    byte[] data = new byte[len]; 

    dis.read(data); 

    return byteArrayToHexString(data); 
} 
+0

因此,如何將我從服務器讀取,任何建議的迴應。我只是嘗試使用this.in = this.socket.getInputStream(),System.out.println(this.in.read());但沒有達到預期的結果。 – Vardhaman 2011-04-06 03:02:15

+0

你正在寫一個字節數組。所以在閱讀時可能需要知道數組的大小,因此我會先寫數組的長度,然後再寫數組。讀取時,讀取長度,然後讀取數組。要將整數寫入流中,請使用DataOutputStream封裝流,然後使用DataInputStream讀取。你可以使用DataOutputStream.writeInt和DataInputStream.readInt。要讀取數組,請讀取(數組);根據以前讀取的大小分配數組之後。 – MeBigFatGuy 2011-04-06 03:04:33

+0

謝謝,但是有什麼辦法可以動態地知道我想要讀取的大小,因爲我不確定服務器可能響應的大小。還有任何想法,如果我沒有收到任何迴應套接字連接應該關閉,以避免大量的開放連接 – Vardhaman 2011-04-06 03:22:09

相關問題