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

写入 snoopOut 后尝试刷新。

于 2009-02-05T05:43:52.663 回答
0

尝试改变:

snoopOut.write(svrRead);

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

您是否尝试关闭 clientSocket?

于 2009-02-05T06:10:13.250 回答
0

这是一个理论:程序开始时您是否从代理连接到服务器?如果几秒钟内没有从套接字获取任何数据,许多网络服务器将断开连接(以避免 DOS 攻击等)。如果是这种情况,那么可能会推迟连接到服务器,直到客户端连接并且您已经读取了来自客户端的请求。

于 2009-02-05T06:47:58.040 回答
0

也许是因为 println() 只在输出中添加了一个换行符 (LF),而 HTTP 规范希望每一行都以 CRLF 结尾?

于 2009-02-05T07:09:33.503 回答
0

在您修改后的描述中,我猜您对 http 消息有疑问。这是正确的:“传输编码:分块”?(在我看来并没有分块)

于 2009-02-05T17:09:02.607 回答
0

好的。我已经半解决了这个问题。编码?这是完美的。一切正常。这是我运行的环境。

我在 vista 机器上测试它,尽管禁用了所有防病毒和防火墙,但它不会让我连接到端口。当我把它带回去工作时,它完美无瑕。为什么?我仍然必须弄清楚。不过谢谢大家的帮助!

于 2009-02-05T20:20:58.660 回答