Java でプロキシ サーバーを作成しています。
最初に、私は(簡略化)
server = new ServerSocket(5568);
incoming = server.accept();
input = incoming.getInputStream();
...
outgoing = new Socket(host, 80);
output = outgoing.getOutputStream();
output.write(inputbuffer, 0, i);
ここで、inputbuffer は、これまでに受信したバイトのコレクションです (ホスト ヘッダーがわかっている部分まで着信データを読み取り、サーバーへの接続を開いて、これまでに取得したものを送信します)。したがって、サーバーはウェルカム ソケット、入力はクライアントからプロキシに送られるデータ、出力はプロキシからサーブへのデータです。
次に、サーバーからの出力を並行してクライアントに書き込み、クライアントがサーバーに書き込みを行う可能性があります。そこで、クライアントから読み取る別のスレッドを作成します。
final InputStream finalInput = input;
final OutputStream finalOutput = output;
Thread sendingStuff = new Thread(){
public void run(){
int c;
while ((c = finalInput.read()) != -1){
finalOutput.write((byte)c);
finalOutput.flush();
}
finalInput.close();
finalOutput.close();
}
}
sendingStuff.start();
最後に、メイン スレッドに別のセクションを用意して、サーバーから読み取り、それをクライアントに書き込みます。
InputStream reverseInput = outgoing.getInputStream();
OutputStream reverseOutput = incoming.getOutputStream();
int c;
while ((c = reverseInput.read()) != -1){
reverseOutput.write((byte)c);
reverseOutput.flush();
}
reverseInput.close();
reverseOutput.close();
何が起こるかというと、入力を取得して出力を送信しますが、ブラウザーは永久にスピンし、クライアントから読み取っているスレッド内の行は -1 シグナルを受け取りません。
多くの場合、「無効なヘッダー名」や「サーバーが理解できないリクエストをブラウザが送信しました」などのエラーが表示されますが、これは私が抱えているこの問題に関係していると思います。クライアントから読み取る行で IOException: Socket Closed が発生したことさえありました。
では、なぜクライアントは EOF を送信しないのでしょうか? そして、これはこれを行う正しい方法ですか?