0

私はJavaでプロキシプログラムを書いています。仕組みは次のとおりです。

  1. ブラウザがプログラムに接続されます。
  2. ブラウザによるすべてのリクエストは、最初に標準出力に出力され、次にサーバーに転送されます。
  3. 次に、サーバーは応答を返します。これは標準出力にも出力され、ブラウザに転送されます。

私の問題は、ステップ 1 は機能し、ステップ 2 は機能しますが、ステップ 3 は失敗することです。プログラムは応答を取得でき、標準出力に適切に出力されますが、ブラウザはそれを取得できないようです。問題を切り分けるためにプログラムを修正しました。

ここで行うことは、応答をブラウザーに直接出力することだけです。

 ServerSocket client = null;
 try {
      client = new ServerSocket(snoopPort);
 } catch (IOException e) {
      System.out.println("ERROR: Could not listen on port: " + snoopPort);
      System.exit(-1);
 }

 Socket clientSocket = null;
 try {
      clientSocket = client.accept();
 } catch (IOException e) {
      System.out.println("ERROR: Accept failed on port: " + snoopPort);
      System.exit(-1);
 }

 PrintWriter snoopOut = new PrintWriter(clientSocket.getOutputStream(), true);

 snoopOut.print("HTTP/1.1 200 OK\r\n");
 snoopOut.print("Date: Thu, 05 Feb 2009 06:37:28 GMT\r\n");
 snoopOut.print("Server: Apache\r\n");
 snoopOut.print("Set-Cookie: Apache=99.245.58.244.1233815848703045; path=/\r\n");
 snoopOut.print("Accept-Ranges: bytes\r\n");
 snoopOut.print("Transfer-Encoding: chunked\r\n");
 snoopOut.print("Content-Type: text/html\r\n");
 snoopOut.print("\r\n");
 snoopOut.print("<html><head><title>test</head><body>hello world!</body></html>\r\n");

 snoopOut.close();

 clientSocket.close();
 client.close();
4

7 に答える 7

0

わかった。私は問題を半ば理解しました。コード?それは完璧だ。すべてが機能します。それは私が走っていた環境でした。

ビスタマシンでテストしていましたが、すべてのウイルス対策とファイアウォールを無効にしても、ポートに接続できませんでした。私がそれを仕事に戻したとき、それは完璧でした。なんで?私はまだそれを理解する必要があります。しかし、みんなの助けに感謝します!

于 2009-02-05T20:20:58.660 に答える
0

改訂された説明では、httpメッセージに問題があると思います。これは正しいですか: "Transfer-Encoding:chunked"?(私にはチャンクに見えません)

于 2009-02-05T17:09:02.607 に答える
0

HTTP 仕様では各行が CRLF で終わることを想定しているのに対し、println() は単一の改行 (LF) のみを出力に追加するためでしょうか?

于 2009-02-05T07:09:33.503 に答える
0

変更してみてください:

snoopOut.write(svrRead);

snoopOut.println(svrRead);
于 2009-02-05T06:05:08.533 に答える
0

clientSocket を閉じようとしましたか?

于 2009-02-05T06:10:13.250 に答える
0

snoopOut への書き込み後にフラッシュを試行します。

于 2009-02-05T05:43:52.663 に答える