Java HTTP Snooper(代理)不转发服务器响应
我正在用Java编写一个代理程序。下面是它的工作原理:Java HTTP Snooper(代理)不转发服务器响应,java,sockets,proxy,monitoring,Java,Sockets,Proxy,Monitoring,我正在用Java编写一个代理程序。下面是它的工作原理: 浏览器将连接到程序 浏览器的任何请求都将首先打印到标准输出,然后转发到服务器 然后,服务器返回一个响应,该响应也打印到standard out,然后转发回浏览器 我的问题是,第一步可行,第二步可行,但第三步失败。该程序可以得到响应,并将其打印到标准输出,但浏览器似乎无法得到响应。我修改了程序以隔离问题 它在这里所做的一切就是直接将响应打印到浏览器: ServerSocket client = null; try { clie
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();
serversocketclient=null;
试一试{
客户端=新服务器套接字(snooport);
}捕获(IOE异常){
System.out.println(“错误:无法侦听端口:“+snooport”);
系统退出(-1);
}
套接字clientSocket=null;
试一试{
clientSocket=client.accept();
}捕获(IOE异常){
System.out.println(“错误:在端口“+snooport”上接受失败);
系统退出(-1);
}
PrintWriter snooput=新的PrintWriter(clientSocket.getOutputStream(),true);
snooput.print(“HTTP/1.1200正常\r\n”);
snooput.print(“日期:2009年2月5日星期四06:37:28 GMT\r\n”);
打印(“服务器:Apache\r\n”);
print(“Set Cookie:Apache=99.245.58.244.1233815848703045;path=/\r\n”);
打印(“接受范围:字节\r\n”);
打印(“传输编码:分块\r\n”);
打印(“内容类型:text/html\r\n”);
snooput.print(“\r\n”);
snooput.print(“testhello world!\r\n”);
snooput.close();
clientSocket.close();
client.close();
在写入Snooput后尝试刷新。尝试更改:
snoopOut.write(svrRead);
到
您是否尝试关闭clientSocket?这里有一个理论:当程序开始时,您是否从代理连接到服务器?如果在几秒钟内没有从套接字获取任何数据,许多Web服务器将断开连接(以避免DOS攻击等)。如果是这种情况,那么可能会推迟连接到服务器,直到客户端已连接并且您已从客户端读取请求。可能是因为println()只向输出中添加了一个换行符(LF),而HTTP规范要求每一行都以CRLF结尾。在您的修订说明中,我猜您对http消息有问题。 是否正确:“传输编码:分块”?
(我看不出有什么不对劲)好的。我已经半了解这个问题了。密码?太完美了。一切正常。这就是我所处的环境
我在vista机器上测试它,尽管禁用了所有防病毒和防火墙,但它不允许我连接到端口。当我把它重新投入工作时,它完美无缺。为什么?我还得想办法。但是谢谢大家的帮助 我也试过了,但浏览器还是什么也没得到。这也不行。虽然,当我使用“println”时,由于IOException,它中途崩溃。每个while循环都在不同的线程中运行(以便它们可以同时读/写)。客户端、服务器和ClientSocket正在其中一个线程(它正在工作的线程)中关闭,但只有在执行完成后才关闭。好主意!我试图通过直接将浏览器应该得到的结果打印到浏览器本身来完全消除web服务器。不幸的是,浏览器仍然没有加载代码。我已经修改了上面的代码,因为它缩小了问题的范围。好吧,我试过了,但是浏览器还是什么都没给我。不过我得说,谢谢你一直以来对我的帮助,谢谢你!不知道还有什么好建议的——也许可以使用wireshark之类的程序窥探实际的TCP/IP流量。至少这样,您就可以知道数据的去向(或不去向,视情况而定)以及连接何时关闭。
snoopOut.println(svrRead);