Java HTTP Snooper(代理)不转发服务器响应

时间:2009-02-05 05:36:28

标签: java sockets proxy monitoring

我在Java中编写了一些代理程序。以下是它的工作原理:

  1. 浏览器将连接到该程序。
  2. 浏览器的任何请求将首先打印出标准输出,然后转发到服务器。
  3. 然后,服务器返回一个响应,该响应也打印到标准输出,然后转发回浏览器。
  4. 我的问题是,第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();
    

7 个答案:

答案 0 :(得分:0)

写入snoopOut后尝试刷新。

答案 1 :(得分:0)

尝试更改:

snoopOut.write(svrRead);

snoopOut.println(svrRead);

答案 2 :(得分:0)

您是否尝试关闭clientSocket?

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

在你修改过的描述中,我猜你的http消息有问题。 这是正确的:“Transfer-Encoding:chunked”? (看起来并不像我一样)

答案 6 :(得分:0)

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

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