2016-10-09 12 views
0

私はJava SocketServerに問題があります。私は非常に基本的なJavaハンドリングWebサーバーを構築しています。リモートクライアントが接続を閉じるまでreadLine()ループが終了しない

私はソケットサーバーを作成しています。これはサーバーをスレッド化したrunメソッドのコードです。 私が抱えている問題は、リモートクライアントが接続を閉じるまで、サーバコードがwhile((line = reader.readLine()) != null)としてフリーズしているようです。私は、クロムプラグインのARC(Advanced REST Client)を使ってテストを行っています。

public void start() throws ServerException{ 
     this.running = true; 

     try{ 
      this.server = new ServerSocket(this.port); 
     }catch(IOException ex){ 
      System.err.println("Failed to create Server Port is inuse!"); 
      throw new ServerException("Unable to bind to port '" + this.port + "'", ex); 
     } 

     while(!isStopped()){ 
      Socket client = null; 
      try{ 
       client = this.server.accept(); 
      }catch(IOException ex){ 
       if(isStopped()) { 
        return; 
       } 
       throw new ServerException("Error accepting client connection", ex); 
      } 
      new Thread(
       new ServerWorker(client, this) 
      ).start(); 
     } 
    } 

これはServerWorker

public void run(){ 
     try { 
      InputStream input = clientSocket.getInputStream(); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(input)); 
      OutputStream output = clientSocket.getOutputStream(); 
      long time = System.currentTimeMillis(); 
      ArrayList<String> lines = new ArrayList<String>(); 
      String line; 

      while((line = reader.readLine()) != null){ 
       lines.add(line); 
      } 
      String[] msg = new String[lines.size()]; 
      msg = lines.toArray(msg); 

      output.write("HTTP/1.1 200\r\n".getBytes()); 
      output.write("\r\n".getBytes()); 

      new HandleConnection(msg).begin(output); 

      reader.close(); 
      output.close(); 
      System.out.println("Request processed: " + time); 
     } catch (IOException e) { 
     } 
    } 

あり、最終的にこれはハンドラである:

public void begin(OutputStream output){ 
    for(int i = 0; i < lines.length; i++){ 
     System.out.println(lines[i]); 
    } 
    try{ 
     output.write("{\"Response\":\"Ok\"}\r\n".getBytes()); 
    }catch(IOException e){} 
} 
+0

あなたのひどく間違ったタイトルが修正されました。 – EJP

+0

@EJP申し訳ありませんが私はデバッグしていたと私は質問の内容を変更してタイトルを変更することを忘れていたエラーをキャッチした。 –

答えて

1

私がいる問題は、サーバー・コードがwhile((line = reader.readLine()) != null)としてフリーズように見えるということですリモートクライアントが接続を閉じるまで

これは問題ではありません。これは、正しく指定された動作です。

問題は、HTTPを正しく実装していないことです。 RFC 2616とその後継者、特にコンテンツ長追加転送エンコーディングに関する部分について十分に理解しておく必要があります。このコードでは、それに関する知識は一切表示されません。

そして、なぜリクエストを処理する前にHTTP 200を送信しているのですか?要求プロセッサが別のコードを返すことを望まないことをどのように知っていますか?

+0

私はコードをテストしているので、コードをテストしている間にそこに戻ります。私がコードを完成したらそこには入りません。ライターのストリームを指摘しても問題ありませんが、その前にすべてのヘッダーを読むという問題が発生します。そのため、私はReadLineを使用しています –

+0

すべてのヘッダーを読むかどうかは問題ありません内容長のヘッダー。あなたは空白を得るまで行を読むだけです。ピアからの応答を読み込もうとしているため、ピアが開いている接続でストリームの終わりまで要求を読み取ることは間違ったままです。コンテンツ長と転送エンコーディングを実装する必要があります。 – EJP

関連する問題