21

サーバーからファイルの内容を読み取ると、次のエラー メッセージが返されます。

Caused by: java.net.SocketException: Connection reset by peer: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(Unknown Source)
at java.net.SocketOutputStream.write(Unknown Source)
at org.apache.coyote.http11.InternalOutputBuffer.realWriteBytes(InternalOutputBuffer.java:215)
at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:462)
at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:366)
at org.apache.coyote.http11.InternalOutputBuffer$OutputStreamOutputBuffer.doWrite(InternalOutputBuffer.java:240)
at org.apache.coyote.http11.filters.ChunkedOutputFilter.doWrite(ChunkedOutputFilter.java:119)
at org.apache.coyote.http11.AbstractOutputBuffer.doWrite(AbstractOutputBuffer.java:192)
at org.apache.coyote.Response.doWrite(Response.java:504)
at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:383)
... 28 more

私のサーブレットプログラムは

 response.setContentType("application/octet-stream");
 response.setHeader("Content-Disposition","attachment;filename="+filename);
 FileInputStream in = new FileInputStream(new File(filepath));
 ServletOutputStream output=response.getOutputStream();
 byte[] outputByte=new byte[4096];
 while(in.read(outputByte,0,4096)!=-1){
     output.write(outputByte,0,4096);//error indicates in this line
 }
 in.close();
 output.flush();
 output.close();

この問題を解決するには?

4

5 に答える 5

3

ソケットがクライアント (ブラウザ) によって閉じられました。

コードのバグ:

byte[] outputByte=new byte[4096];
while(in.read(outputByte,0,4096)!=-1){
   output.write(outputByte,0,4096);
}

最後のパケット読み取り、次に書き込みの長さは 4096 未満である可能性があるため、次のことをお勧めします。

byte[] outputByte=new byte[4096];
int len;
while(( len = in.read(outputByte, 0, 4096 )) > 0 ) {
   output.write( outputByte, 0, len );
}

それはあなたの質問ではありませんが、私の答えです... ;-)

于 2012-10-20T08:10:07.903 に答える
0

問題が発生している可能性があるようです

while(in.read(outputByte,0,4096)!=-1){

オフセットを進めないために無限ループに入る可能性があります (呼び出しでは常に 0 です)。試す

while(in.read(outputByte)!=-1){

これは、デフォルトで outputByte.length までを に読み込もうとしますbyte[]。この方法では、オフセットを気にする必要はありません。FileInputStrem の read メソッドを参照

于 2012-10-20T09:27:08.413 に答える