簡體   English   中英

java 套接字輸出流和損壞 pipe

[英]java socket outputstream and broken pipe

我必須向套接字 stream 發送動態緩沖區大小。它工作正常,但是當我嘗試發送大小大於int my_buffer_size =18 * 1024的多個緩沖區時; (這是一個指示值)

我收到錯誤(對於某些寫入):

Java.net.SocketException: Broken pipe
at java.net.SocketOutputStream.socketWrite0(Native Method)

我的代碼非常簡單:例如,如果我想發送一個大文件,我會讀取一個文件 stream

byte[] bs = new byte[my_buffer_size];
while (... ){ 
fileInputStream.read(bs);
byte[] myBufferToSend = new byte[sizeBuffer];
DataOutputStream out = new DataOutputStream(cclient.getoutputStream());
out.writeInt(myBufferToSend.length);
out.write(myBufferToSend);
out.flush();
}

(該文件只是一個測試,緩沖區大小可以是可變的)

SendBufferSize 是 146988。

有沒有辦法修復損壞的 pipe 錯誤? 我四處閱讀,但實際上我沒有解決問題。

謝謝任何幫助表示贊賞

我使用經典的 ServerSocket serverSocket; 和套接字客戶端

“斷管”表示您已將數據寫入已被另一端關閉的連接。

問題在於另一端,而不是在此代碼中。 可能另一端並不真正理解你的長字協議,或者沒有正確實現它。

如果它與此代碼類似,則不會,因為您忽略了read()返回的結果並假設它填充了緩沖區。 沒有指定這樣做,只傳輸至少一個字節。

通常, DataInputStream不支持接收大塊,因為read方法只是委托給底層套接字輸入 stream,而套接字輸入 stream 不會抱怨沒有讀取全部。 例如,在 Oracle Java 8 中,您會得到一些 2^16 字節,而 rest 將被忽略。 因此,當您在DataInputStream.read返回后關閉套接字時,發送方節點觀察到“管道損壞”,同時仍在嘗試發送巨大塊的 rest。 解決方案是窗口閱讀。 下面是一個DataInputStream子類,它正是這樣做的。

import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;

public class HugeDataInputStream extends DataInputStream
{
    int maxBlockLength;

    public HugeDataInputStream(InputStream in)
    {
        this(in, 0x8000);
    }

    public HugeDataInputStream(InputStream in, int maxBlockLength)
    {
        super(in);
        this.maxBlockLength = maxBlockLength;
    }

    public int readHuge(byte[] block) throws IOException
    {
        int n = block.length;
        if (n > maxBlockLength)
        {
            int cr = 0;
            while (cr < n)
            {
                cr += super.read(block, cr, Math.min(n - cr, maxBlockLength));
            }
            return cr;
        }
        else
        {
            return super.read(block);
        }
    }
}

暫無
暫無

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

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