[英]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.