dポイントプレゼントキャンペーン実施中!

はじめまして。
前に質問したことがあるのですが、前回の続きです。
私は、今、WEBサーバプログラムをJavaでやろうとしています。
そこで、ServerSocket(nPort)を使い、ポート番号は80を指定して、サーバーソケットを作成しています。
ポートを開けることができたのですが、指定したフォルダにあるindex.htmlが見れません。
真っ白な画面のままで表示されないんです。
ログを見たところ、
Tue Mar 26 10:11:33 JST 2013127.0.0.1Failed/favicon.ico
Tue Mar 26 10:43:16 JST 20130:0:0:0:0:0:0:1Failed/blog/favicon.ico
Tue Mar 26 11:31:33 JST 2013127.0.0.1Failed/
Tue Mar 26 11:31:33 JST 2013127.0.0.1Failed/favicon.ico
Tue Mar 26 11:31:39 JST 2013127.0.0.1OK/index.html
Tue Mar 26 11:31:39 JST 2013127.0.0.1Failed/favicon.ico

となっています。index.htmlに行こうとするとログでは、
Tue Mar 26 11:31:39 JST 2013127.0.0.1OK/index.html
と出力されます。
ソースはhttp://www5c.biglobe.ne.jp/~ecb/java/java00.htmlにある、17.中間試験の回答例にあります。
ソース内のHTTPThread.javaのsendTargetメソッド内で何をやっているかはすごく気になります。
もし差し支えなければ、この処理を説明してもらえれば有難いです。
自分はWindowns7 64bit Eclipse 3.6を使用しています。

A 回答 (4件)

#1です。


#1の3点はどうやら関係なさそうです。申し訳ないorz

あちらのソースを見ていて気になった点を1つ。
HTTPThread.javaのsendTargetメソッドで、
 return true;
の前に、
 bos.flush();
という一行を追加してみるとどうでしょうか?
    • good
    • 0
この回答へのお礼

bos.flush();を一行追加するとindex.htmlが表示されました!!
今まで行き詰っていたところが一気に解決しました!!
ありがとうございます。\(^ ^)/
でも、どうしてbos.flush();を追加すると表示されたのでしょう?

お礼日時:2013/03/28 11:16

#1(=#2)です。



無事動いたようでよかったです。

WireSharkでパケットキャプチャする方法もありますが、
FireFoxをお使いならWebコンソールが便利です。
クライアント側の視点からではありますが、「パケット」を意識せずに通信内容を確認できます。


> どうしてbos.flush();を追加すると表示されたのでしょう?
当初の質問から外れてくるので、
本来は新しくトピックを立てた方がいいと思いますが、おまけで。

BufferedOutputStreamは名前の通り内部にバッファを持っており、
writeメソッドで書き込まれたデータは一旦バッファに溜め込まれます。
ですから、この時点では何も出力されていません。
バッファがいっぱいになるか、flushまたはcloseメソッドが呼ばれて初めて出力されます。

今手元に環境がないのでデストラクタでflushしてくれるかどうかは確認できませんが、
ガベージ・コレクションが行われないとfinalize処理が走らないため、
デストラクタ頼みにすることは避けるべきです。
    • good
    • 0
この回答へのお礼

了解しました。
バッファに溜まったデータを出力するためにはフラッシュをするんですね。
回答ありがとうございます。

お礼日時:2013/03/28 17:01

>ついでで申し訳ないのですが、こういった場合のデバック方法


>としてはどのようにやるのが効果的でしょうか?

もう1台PCがあってLANで繋がっているならば…WireSharkでパケットキャプチャしながら実行する。
ってトコですかね。

気になるところっていうと…HTTPレスポンスヘッダにContents-Lengthヘッダとかないのかな?
とかでしょうかねぇ。

バッファのフラッシュに関しては#2で指摘がありますが…デストラクタで処理されるんじゃないですかねぇ……。

この回答への補足

>もう1台PCがあってLANで繋がっているならば…WireSharkでパケッ>>トキャプチャしながら実行する。
サーバーサイドプログラミングにはWireSharkは欠かせないんですね。

>もう1台PCがあってLANで繋がっているならば…WireSharkでパケットキャプチャしながら実行する。
HTTPレスポンスヘッダにContents-Lengthヘッダがあるかないか調べようと思います。

JVMだとデストラクタは内部で自動的に行っているんですよねぇ。
なのでどうなっているか分からないんですよ。
結果をみますとどうやらバッファをフラッシュしてくれる。ということは無さそうですね。

補足日時:2013/03/28 11:21
    • good
    • 0
この回答へのお礼

返答ありがとうございます。

お礼日時:2013/03/28 11:26

HTTP, HTMLの仕組みについてもう少し勉強しましょう。


そうすればsendTargetメソッドの処理もすぐわかります。

以下の3点と併せて考えてみてください。
(1)index.htmlを表示するだけなのに、favicon.icoに関するログが出ているのはなぜ?
(2)ほかのHTMLだと正常に表示される?(テキストのみの場合・テキスト+画像の場合)
(3)ソースから、OKのログ・Failedのログはどういうときに出る?

この回答への補足

もしよろしければ、上記のソースから私と同じくWEBサーバープログラムを実行して頂ければ問題解決がしやすいと思います。

補足日時:2013/03/27 16:49
    • good
    • 0
この回答へのお礼

>HTTP, HTMLの仕組みについてもう少し勉強しましょう。
>そうすればsendTargetメソッドの処理もすぐわかります。
問題はここだけでしょうか?
正直、問題箇所自体絞れてなくて、当方は困り果てておりました。

(1)index.htmlを表示するだけなのに、favicon.icoに関するログが出ているのはなぜ?
A.favicon.icoがでていますね。どうやらアドレスに表示されるアイコンのようです。IEで開くとこれは要求されませんでした。


(2)ほかのHTMLだと正常に表示される?(テキストのみの場合・テキスト+画像の場合)

A.テキスト表示にしましたが、真っ白のままです。;;
ついでで申し訳ないのですが、こういった場合のデバック方法
としてはどのようにやるのが効果的でしょうか?

(3)ソースから、OKのログ・Failedのログはどういうときに出る?
A.アドレスを入れてEnterキー押下した時に表示されます。

お礼日時:2013/03/27 16:26

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!