1

私は現在、ブラウザからhttpリクエストを受け取り、それを処理してから、目的のWebサーバーに転送する単純なプロキシサーバーに取り組んでいます。

ブラウザによって接続されたソケットの入力ストリームからリクエストを取得しようとしましたが、データの最後のブロックを受信した後にストリームがスタックすることを除いて、すべて問題ありません。

以下に示すように、私のコードは実際には非常に単純です。

ServerSocket servSocket = new ServerSocket(8282);  
Socket workSocket = servSocket.accept();  
InputStream inStream = workSocket.getInputStream();  
byte[] buffer = new byte[1024];  
int numberRead = 0;  

while ((numberRead = inStream.read(buffer, 0, 1024)) != -1){  
System.out.println(new String(buffer));  
}  

リクエストの受信が終了しても、ループから抜け出すことはできません。

この問題を回避する方法はありますか?

アドバイスをよろしくお願いします。

4

5 に答える 5

1

InputStream javadocの場合と同様に、メソッドはデータが使用可能になるかEOFが検出されるまでブロックします。したがって、Socketの反対側はそれを閉じる必要があります-そうすると、inStream.read()呼び出しが返されます。

もう1つの方法は、最初に読みたいメッセージのサイズを送信することです。これにより、読み取る必要のあるバイト数が事前にわかります。または、BufferedReaderを使用して、ソケットから行単位で読み取ることができます。BufferedReaderには、行が読み取られるたびに返されるメソッドreadLine()があります。これは、HTTPプロトコルパッケージが行に分割されているため、機能するはずです。

于 2010-03-03T10:55:39.147 に答える
0

現在のコードによると、直接的な解決策ではありません。

HTTP は回線ベースのプロトコルであるため、Buffered Readerを使用して呼び出すreadLine()ことができます。

于 2010-03-03T11:03:42.757 に答える
0

http リクエストが着信すると、常に空白行で終了します。たとえば、次のようになります。

GET /someFile.html HTTP/1.1
Host: www.asdf.com

そのリクエストを送信した後、クライアント接続はサーバーからの応答を待ってから接続を閉じます。したがって、ユーザーからのリクエストを解析したい場合は、おそらく BufferedReader を使用して、空白行のテキスト行に到達するまで全行を読み取る方がよいでしょう。

于 2010-03-03T13:50:19.647 に答える
0

接続が閉じられるまで循環し、クライアントはおそらくあなたからの HTTP 応答を待っていて、閉じません。

于 2010-03-03T10:52:29.537 に答える
0

ブラウザーは、接続を閉じる前に応答を待機しています。一方、読み取りメソッドは、ストリーム/接続が閉じられるか、新しいデータが受信されるまでブロックされます。

于 2010-03-03T11:00:34.530 に答える