- PR -

SocketExceptionについて

1
投稿者投稿内容
n.w
大ベテラン
会議室デビュー日: 2003/07/15
投稿数: 126
お住まい・勤務地: 神奈川
投稿日時: 2004-07-01 16:17
お世話になってます、何度も書き込んでいいものが
悩みましたが、行き詰ってしまい書き込んでみました。

Servletクラスにて、responseにてOutputStreamを取得し、
以下のようにバイト単位でOutputStreamへ書き込んだ際
書き込みのwriteでSocketExceptionが発生してしまいます。
Javadocでは使用しているプロトコルでエラー (TCP エラーなど)
となっているのですが、問題がどうしてもわかりません。

どなたかご存知のかたご教授または、調べるのに適した
サイトなどお教え願います。
コード:
	FileInputStream fis = null;
	OutputStream out = response.getOutputStream();
	try {
		fis = new FileInputStream(
				"c:\\ereport\\pdf" + "\\" + sessionId + "\\" + pdfFilename);
		byte[] buf = new byte[4 * 1024];
		int bytesRead;
		while ((bytesRead = fis.read(buf)) != -1) {
			out.write(buf, 0, bytesRead);
		}
	} finally {
		if (fis != null)
			fis.close();
	}
	
	
java.net.SocketException: Software caused connection abort: socket write error
	at java.net.SocketOutputStream.socketWrite0(Native Method)
	at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
	at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
	at org.apache.coyote.http11.InternalOutputBuffer$OutputStreamOutputBuffer.doWrite(InternalOutputBuffer.java:668)
	at org.apache.coyote.http11.filters.ChunkedOutputFilter.doWrite(ChunkedOutputFilter.java:171)
	at org.apache.coyote.http11.InternalOutputBuffer.doWrite(InternalOutputBuffer.java:523)
	at org.apache.coyote.Response.doWrite(Response.java:524)
	at org.apache.coyote.tomcat4.OutputBuffer.realWriteBytes(OutputBuffer.java:384)
	at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:360)
	at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:338)
	at org.apache.coyote.tomcat4.OutputBuffer.writeBytes(OutputBuffer.java:411)
	at org.apache.coyote.tomcat4.OutputBuffer.write(OutputBuffer.java:398)
	at org.apache.coyote.tomcat4.CoyoteOutputStream.write(CoyoteOutputStream.java:110)
	at astest.ASServlet2.processRequest(ASServlet2.java:96)
	at astest.ASServlet2.doPost(ASServlet2.java:139)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:760)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:260)
	at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
	at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
	at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
	at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2415)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180)
	at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
	at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:170)
	at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:172)
	at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
	at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174)
	at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
	at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
	at org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java:223)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:432)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:386)
	at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:534)
	at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:530)
	at java.lang.Thread.run(Thread.java:536)	

みゅう
会議室デビュー日: 2004/07/01
投稿数: 2
投稿日時: 2004-07-01 17:07
状況がよく分からないのでなんとも言えませんが、
1.コンテントタイプを設定していないから。
2.出力ストリームに対してflush()していないから。
このような原因が考えられるかもしれません。

私の場合、以下のようなソースで処理してます。

(かなり省略してます)--------------------------------------
HttpServletResponse prmRes;

// ファイルの種類を設定する
//ファイル名から判定したコンテントタイプを設定する
prmRes.setContentType(contentType);

// ヘッダー情報の設定を行う。
prmRes.setHeader( DEFAULT_RESPONSE_HEADER_NAME, getResponseHeaderValue(fName) );

baos = new ByteArrayOutputStream();

while( download_fis.read( buff ) > 0 ) {
// そのまま内容を転送する。
baos.write(buff);
baos.flush();
}

baos.writeTo( prmRes.getOutputStream() );
baos.close();
baos = null;

download_fis.close();
download_fis = null;

--------------------------------------------------

なお、プラットフォームによっては、
flush()を行なわないと、エラーになることがあるようです。
(WebLogic8.1Jでは必須でした)

ご参考になればよいのですが...
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-07-01 17:44
引用:

みゅうさんの書き込み (2004-07-01 17:07) より:
なお、プラットフォームによっては、
flush()を行なわないと、エラーになることがあるようです。
(WebLogic8.1Jでは必須でした)


flush必須というのは、Servletから取得したOutputStreamに対してですか?
であれば、flush「しない」のが原則だと思いますが。少なくともWebLogicでは以下のように
明示されています。

http://edocs.beasys.co.jp/e-docs/wls/docs81/servlet/progtasks.html#159442
みゅう
会議室デビュー日: 2004/07/01
投稿数: 2
投稿日時: 2004-07-01 18:10
UKさんへ
-------------------------------------------------------------------------------
flush必須というのは、Servletから取得したOutputStreamに対してですか?
であれば、flush「しない」のが原則だと思いますが。少なくともWebLogicでは以下のように
明示されています。
------------------------------------------------------------------------------
すみません。
手元の資料をよく確認したところ、WebLogicの件は全く関係なく、この箇所のコードは別の現象を回避するためのものでした。
(このコードは参考になりませんでしたね)
混乱させてしまい、誠に申し訳ありません。
発言は訂正させていただきます。
ご指摘いただき誠にありがとうございました。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-07-01 19:23
「Tomcat "socket write error" "Software caused connection abort"」で検索すると
いくつか出てくるのですが、セキュリティ絡みやApacheとの連携絡みが多いようです。

・クライアントは何か(ブラウザ? アプレット?)
・送ろうとしているファイルサイズはどれくらいか
・Apacheと連携していないか

など情報をできるだけ詳しく出してください。
n.w
大ベテラン
会議室デビュー日: 2003/07/15
投稿数: 126
お住まい・勤務地: 神奈川
投稿日時: 2004-07-01 19:31
みなさん御意見ありがとうございます。

ukさん
色々試して少しわかった事があります。
SokectExceptionが出る際、ブラウザ(IE)が上がって
いないと落ちてしまいます。 IEが上がっているとException
は出ず、while文も普通に通過しています。

クライアントはFacadoというツールを使っていまして
デバッグ環境の為Appletのイメージになります。

ファイルサイズ的には18KBのPDFで、Tomcat単独でApacheとの
連携は行っていません。

現状ブラウザをあげているとSocketExceptionは発生しないのですが
ひどく不安定な状態です
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-07-01 20:09
アプレット絡みだと、そのものズバリではないですが
http://www.freeml.com/message/jboss-fan@freeml.com/0002003
とか似たような現象が起きているものが見当たりますね。

まず、原因の切り分けのために件のサーブレットが通常のHTTP POSTで動作することを
確認し、それから先はお使いのツールベンダに問い合わせるのがよいのではないでしょうか。
1

スキルアップ/キャリアアップ(JOB@IT)