簡體   English   中英

Java套接字-管道破裂錯誤

[英]Java Socket - Broken pipe error

我正在嘗試通過套接字從客戶端向服務器發送int值, long值, long數組和2d double數組。

我成功發送了int,long值和long數組,但是當涉及到double數組(output.writeObject(server_ind);-參見下面的客戶端代碼)時,出現以下錯誤:

錯誤:

java.net.SocketException: Broken pipe
    at java.net.SocketOutputStream.socketWrite0(Native Method)
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:113)
    at java.net.SocketOutputStream.write(SocketOutputStream.java:159)
    at java.io.ObjectOutputStream$BlockDataOutputStream.drain(ObjectOutputStream.java:1876)
    at java.io.ObjectOutputStream$BlockDataOutputStream.writeByte(ObjectOutputStream.java:1914)
    at java.io.ObjectOutputStream.writeFatalException(ObjectOutputStream.java:1575)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:350)
    at clientSide.ClientSocket.connectionProtocol(ClientSocket.java:36)
    at clientSide.clientMain.main(clientMain.java:97)

我的代碼如下:

客戶端:

        ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream());

        output.writeObject(num_doc); //int value
        output.flush();

        output.writeObject(num); //long value
        output.flush();

        output.writeObject(queryTDs); //long[] array
        output.flush();

        output.writeObject(server_ind); //double[][]
        output.flush();

服務器端:

    input = new ObjectInputStream(clientSocket.getInputStream());

    num_doc = input.readInt();
    num = input.readLong();
    TDs = (long[]) input.readObject();
    server_ind = (double[][]) input.readObject();

    output = new ObjectOutputStream(clientSocket.getOutputStream());
    output.writeObject("Received");

謝謝!

當發送者和接收者之間的連接在發送者完成發送所有流之前被接收器(在本例中為服務器端)關閉時,發生斷開Broken pipe Exception

檢查您的代碼,我注意到:

在第一種情況下,您要發送和接收32位( int )的對象:

output.writeObject(num_doc); //int value output.flush();

並等待32位:

num_doc = input.readInt();

當您發送和接收64位( long型)時,第二種情況相同

對於long[]您正在發送一個對象,其大小取決於oracle文檔中針對ObjectOutputStream的數據量和數據類型:

將指定的對象寫入ObjectOutputStream。 寫入對象的類,類的簽名以及該類及其所有超類型的非瞬態和非靜態字段的值

但是對於double[][] ,您要發送的是( double[] ),每個元素都有另一個double[] 由於某些原因,這對我來說還不清楚, ObjectInputStream無法讀取客戶端發送的所有對象。

因此,接收器可能不知道要讀取多少字節才能構建雙精度數組。

您的一個問題(@ Liutauras94):服務器端是否有異常?

我建議您將double值轉換為4個字節(64位)的數組,並使用方法write(byte [])而不是writeObject發送它。 厭倦了其他部分的字節順序。

另外,在Java中,還有另一種處理數字數據類型的流編寫器,它們比嘗試發送對象更好。

您正在編寫對象,但正在讀取基元。 因此,最終您讀取的數據少於那里的實際數據,更不用說完全錯誤的數據了。 然后在套接字中仍有未讀的掛起數據時關閉套接字; 並導致連接重置傳播到編寫器; 這會導致“管道破裂”。

如果使用writeObject()寫入數據,則必須使用readObject()讀取數據。 如果使用writeInt()寫入數據,則必須使用readInt()讀取數據。 等等。

暫無
暫無

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

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