2011-10-20 15 views
2

リクエスト用にポート8000​​をリッスンする単純なHTMLサーバープログラムがあります。私はサーバープログラムからHTMLファイルを要求し、要求されたHTMLをブラウザに送り返すことができるようにしたい。現在、サーバーは要求を受け取り、要求から要求されたファイル名を解析し、htmlファイルの内容をコンソールに出力します。しかし、HTMLファイルの内容を接続のソケットに(ブラウザに戻って)印刷しようとすると、何も起こりません。ブラウザはロードを続行します。ブラウザへのサーバーの応答を書き込みます。Java

私のサーバークラスは比較的単純で、単に各接続のために、この実行可能なクラス、要請ハンドラのインスタンスを作成します。

package server; 

import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.PrintWriter; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.util.Scanner; 

public class RequestHandler extends Thread { 

    Object block; 
    ServerSocket serverSocket; 
    BufferedReader socketReader; 
    PrintWriter socketWriter; 

    public RequestHandler(Object block, ServerSocket serverSocket){ 
     this.block = block; 
     this.serverSocket = serverSocket; 
    } 

    @Override 
    public void run() { 
     try{ 
      System.out.println("Waiting for request..."); 
      Socket clientSocket = serverSocket.accept(); 
      System.out.println("Connection made."); 

      synchronized(block){ 
       System.out.print("Notifying server thread..."); 
       block.notify(); 
       System.out.println("...done"); 
       System.out.println(); 
      } 

      socketReader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));    
      socketWriter = new PrintWriter(clientSocket.getOutputStream(), true); 

      String input; 
      while((input = socketReader.readLine()) != null){ 
//    System.out.println(input); 

       if(input.startsWith("GET")){ 
        getResource(input); 
       } 
      } 
     }catch(IOException e){ 
      System.out.println("IOException!"); 
      e.printStackTrace(); 
     } 
    } 

    public void getResource(String getRequest){ 
     String[] parts = getRequest.split("\\s+"); 
     String filename = parts[1].substring(1); 

     System.out.println(filename); 
     File resource = new File(filename);    
     sendResponse(resource); 
    } 

    public void sendResponse(File resource){ 
     System.out.println(resource.getAbsolutePath()); 

     Scanner fileReader; 
     try { 
      fileReader = new Scanner(resource); 

      while(fileReader.hasNext()){ 
       String line = fileReader.nextLine(); 
       System.out.println(line); 
       socketWriter.println(line); 
      } 
     } catch (FileNotFoundException e) { 
      System.out.println("File not found!"); 
      e.printStackTrace(); 
     } 
    } 

} 
+1

HTTPヘッダーを提供しようとしましたか?それが役に立ちます... – alf

+0

HTTP仕様:http://www.w3.org/Protocols/rfc2616/rfc2616.html –

+0

ブラウザからどのように電話をしていますか? URIの形式は何ですか? –

答えて

3

あなたはへの書き込みまたはストリームからの読み込み完了したら、あなたはいつも何をすべき? (私はあなたの質問に対する回答を知っていますが、あなたの質問を「宿題」と書いたのでこの質問をしています)

+0

彼は、テキストとして出力されるだけでなく、HTMLがレンダリングされることを望むなら、コンテンツの前にソケットに何かを書くべきです。 RFCやテキストブックを読むことは役に立ちます。 –

+0

私はこれまで考えていたことをお伝えいただきありがとうございますが、私がストリームを閉鎖すれば何らかの理由でより多くのリクエストを引き続き聞くことができないと考えました。 @AlexGitelmanは "HTTP/1.1 200 OK"ステータス行を参照していますか? –

+0

@AlexGitelman HTMLコードをプレーンテキストとして表示するのではなく、ブラウザがHTML Webページとしてレスポンスをレンダリングするようにするには、HTTPレスポンスにヘッダを追加する必要があります: 'Content-type:text/html' – Michael

関連する問題