2017-02-14 5 views
0

ソケットを使用してhttpserverを作成しようとしていますが、この問題が発生します。 誰もが知っているように、Httpリクエストはこのようなものです。JavaでフルHTTPリクエストを取得する方法

GET /index.html HTTP/1.1 
Cache-Control: max-age=0 
Host: 127.0.0.1 
Accept:xxxxx 
User-Agent: xxxx 
Connection: keep-alive 
CRLF 
This is message body! 

メッセージ本体を含めた完全なHttpリクエストを取得するにはどうすればよいですか。 こう書いてみました。私はこの

ServerSocket serverSocket = new ServerSocket(8000); 
while (true) { 
Socket socket = serverSocket.accept(); 
new Thread() { 
    { 
    InputStream is = socket.getInputStream(); 
    BufferedReader input = new BufferedReader(new InputStreamReader(is)); 
    String line = null; 
    while (input.ready()) { 
    line = input.readLine(); 
    System.out.println(line); 
    } 
    System.out.println("finish"); 
    } 
}.start(); 
} 

物事のように変更さ.Then

ServerSocket serverSocket = new ServerSocket(8000); 
while (true) { 
Socket socket = serverSocket.accept(); 
new Thread() { 
    { 
    InputStream is = socket.getInputStream(); 
    BufferedReader input = new BufferedReader(new InputStreamReader(is)); 
    String line = null; 
    while ((line = input.readLine()) != null) { 
    System.out.println(line); 
    } 
    System.out.print("finish"); 
    } 
}.start(); 
} 

とコンソールは、私たちは「仕上げ」を見ることができる方が良いに行く「完了」を印刷することはありません!しかし、私は少し早くページをリフレッシュする場合。バッファーリーダーは準備ができていないし、中に取得しないで{}!

私はすべてのrerquestと "仕上げ"

を印刷したい私を助けてください。 ありがとうございました!

+0

ストリームは、クライアントが接続を閉じるときにのみ終了します。要求は同じ接続上で次の要求を送信したいので、接続を生きたままにすることであるので、それをしません。長さのヘッダに基づいてループを書くべきです(ほとんどのGETリクエストはリクエストボディを送信しません)。 – RealSkeptic

+0

'httpserver throw socket'は無意味です。あなたが何を求めているのか不明です。 – EJP

+0

@EJP彼は "スルー"を意味しました – Malt

答えて

0

どちらの方法も正しくありません。リクエストがを終了していないとき、最初のもので

input.readLine()は、ストリームの終わりに達しただけ nullを返します。これは、ブラウザがTCP接続を開いたままにしておく限り、ループすることを意味します。それはしばらく時間がかかるかもしれません。さらに、同じ接続で複数のリクエストが送信される可能性があるため、すべてのリクエストが印刷される可能性があります(これが何をしたいのか分かりません)。

第2の問題では、タイミングに問題があります。 input.ready()は、受信バッファがであるかどうかをチェックする代わりに、のいずれかのの内容を読み取るかどうかを確認します()。だから、すべてを待つのではなく、要求の一部だけを印刷することになるかもしれません。このアプローチと正しいタイミングで、要求の一部、複数の要求、またはその間の何か(要求と半分のような)を出力することになります。

HTTP GETメッセージalmost never carry any payalodもあり、ブラウザには例のようなリクエストはありません。

+0

リクエストが終了したかどうかはどのように知ることができますか?本当にthx – lxhsb

+0

@lxhsb HTTPを実装するには、RFC 2616や友人に関する深い知識、具体的にはコンテンツの長さと転送エンコーディングに関する部分が必要です。推測だけでは十分ではありません。 – EJP

+0

CR LF CR LFまで読んでください。それはあなたにヘッダーを与えるでしょう。ペイロードが必要な場合は、ヘッダーを解析し、ペイロードの量を把握する必要があります。 – Malt

関連する問題