- ベストアンサー
localhostで.htmlを表示する方法
- Javaを使用してWEBサーバプログラムを作成し、localhostで.htmlファイルを表示したい場合、ServerSocketを使用してポート番号80でサーバーソケットを作成します。しかし、指定したフォルダにあるindex.htmlが表示されない問題が発生しています。
- ログを確認したところ、index.htmlにアクセスする際に/favicon.icoのアクセスが失敗していることが分かりました。指定したフォルダにはindex.htmlが存在し、正常にアクセスされていることも確認できました。
- HTTPThread.javaのsendTargetメソッドでは、クライアントからのリクエストに応じて、index.htmlを送信しています。このメソッドはソースコードの中でも非常に重要な部分であり、自分自身で理解しておくことが必要です。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
#1です。 #1の3点はどうやら関係なさそうです。申し訳ないorz あちらのソースを見ていて気になった点を1つ。 HTTPThread.javaのsendTargetメソッドで、 return true; の前に、 bos.flush(); という一行を追加してみるとどうでしょうか?
その他の回答 (3)
- Picosoft
- ベストアンサー率70% (274/391)
#1(=#2)です。 無事動いたようでよかったです。 WireSharkでパケットキャプチャする方法もありますが、 FireFoxをお使いならWebコンソールが便利です。 クライアント側の視点からではありますが、「パケット」を意識せずに通信内容を確認できます。 > どうしてbos.flush();を追加すると表示されたのでしょう? 当初の質問から外れてくるので、 本来は新しくトピックを立てた方がいいと思いますが、おまけで。 BufferedOutputStreamは名前の通り内部にバッファを持っており、 writeメソッドで書き込まれたデータは一旦バッファに溜め込まれます。 ですから、この時点では何も出力されていません。 バッファがいっぱいになるか、flushまたはcloseメソッドが呼ばれて初めて出力されます。 今手元に環境がないのでデストラクタでflushしてくれるかどうかは確認できませんが、 ガベージ・コレクションが行われないとfinalize処理が走らないため、 デストラクタ頼みにすることは避けるべきです。
お礼
了解しました。 バッファに溜まったデータを出力するためにはフラッシュをするんですね。 回答ありがとうございます。
- Wr5
- ベストアンサー率53% (2173/4061)
>ついでで申し訳ないのですが、こういった場合のデバック方法 >としてはどのようにやるのが効果的でしょうか? もう1台PCがあってLANで繋がっているならば…WireSharkでパケットキャプチャしながら実行する。 ってトコですかね。 気になるところっていうと…HTTPレスポンスヘッダにContents-Lengthヘッダとかないのかな? とかでしょうかねぇ。 バッファのフラッシュに関しては#2で指摘がありますが…デストラクタで処理されるんじゃないですかねぇ……。
お礼
返答ありがとうございます。
補足
>もう1台PCがあってLANで繋がっているならば…WireSharkでパケッ>>トキャプチャしながら実行する。 サーバーサイドプログラミングにはWireSharkは欠かせないんですね。 >もう1台PCがあってLANで繋がっているならば…WireSharkでパケットキャプチャしながら実行する。 HTTPレスポンスヘッダにContents-Lengthヘッダがあるかないか調べようと思います。 JVMだとデストラクタは内部で自動的に行っているんですよねぇ。 なのでどうなっているか分からないんですよ。 結果をみますとどうやらバッファをフラッシュしてくれる。ということは無さそうですね。
- Picosoft
- ベストアンサー率70% (274/391)
HTTP, HTMLの仕組みについてもう少し勉強しましょう。 そうすればsendTargetメソッドの処理もすぐわかります。 以下の3点と併せて考えてみてください。 (1)index.htmlを表示するだけなのに、favicon.icoに関するログが出ているのはなぜ? (2)ほかのHTMLだと正常に表示される?(テキストのみの場合・テキスト+画像の場合) (3)ソースから、OKのログ・Failedのログはどういうときに出る?
お礼
>HTTP, HTMLの仕組みについてもう少し勉強しましょう。 >そうすればsendTargetメソッドの処理もすぐわかります。 問題はここだけでしょうか? 正直、問題箇所自体絞れてなくて、当方は困り果てておりました。 (1)index.htmlを表示するだけなのに、favicon.icoに関するログが出ているのはなぜ? A.favicon.icoがでていますね。どうやらアドレスに表示されるアイコンのようです。IEで開くとこれは要求されませんでした。 (2)ほかのHTMLだと正常に表示される?(テキストのみの場合・テキスト+画像の場合) A.テキスト表示にしましたが、真っ白のままです。;; ついでで申し訳ないのですが、こういった場合のデバック方法 としてはどのようにやるのが効果的でしょうか? (3)ソースから、OKのログ・Failedのログはどういうときに出る? A.アドレスを入れてEnterキー押下した時に表示されます。
補足
もしよろしければ、上記のソースから私と同じくWEBサーバープログラムを実行して頂ければ問題解決がしやすいと思います。
お礼
bos.flush();を一行追加するとindex.htmlが表示されました!! 今まで行き詰っていたところが一気に解決しました!! ありがとうございます。\(^ ^)/ でも、どうしてbos.flush();を追加すると表示されたのでしょう?