【问题标题】:Java HTTP Snooper(Proxy) Does Not Forward Server ResponseJava HTTP Snooper(代理)不转发服务器响应
【发布时间】:2009-02-05 05:36:28
【问题描述】:

我正在用 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();

【问题讨论】:

    标签: java sockets proxy monitoring


    【解决方案1】:

    写入 snoopOut 后尝试刷新。

    【讨论】:

    • 我也试过了,但是浏览器还是什么都没有。
    【解决方案2】:

    尝试改变:

    snoopOut.write(svrRead);
    

    snoopOut.println(svrRead);
    

    【讨论】:

    • 那也行不通。虽然,当我使用“println”时,由于 IOException,它在中途崩溃。
    【解决方案3】:

    您是否尝试关闭 clientSocket?

    【讨论】:

    • 每个 while 循环都在单独的线程中运行(以便它们可以同时读/写)。 Client、Server 和 ClientSocket 在其中一个线程(它正在工作的线程)中被关闭,但只有在执行完成之后。
    【解决方案4】:

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

    【讨论】:

    • 好主意!我试图通过直接将浏览器应该得到的结果打印到浏览器本身来完全消除 Web 服务器。不幸的是,浏览器仍然没有加载代码。我已经修改了上面的代码,因为它缩小了问题范围。
    【解决方案5】:

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

    【讨论】:

    • 好的,我试过了,但浏览器仍然没有给我任何东西。不过我得说,感谢您到目前为止对我的帮助,感谢!
    • 不确定还有什么建议 - 或许可以使用诸如 wireshark 之类的程序窥探实际的 TCP/IP 流量。至少,您将了解数据的去向(或视情况而定)以及连接何时关闭。
    【解决方案6】:

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

    【讨论】:

      【解决方案7】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-14
        • 1970-01-01
        • 2020-03-23
        • 2013-05-03
        • 2018-10-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多