我在Java中编写了一些代理程序。以下是它的工作原理:
我的问题是,第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();
答案 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机器上测试它,尽管禁用了所有的防病毒和防火墙,它也不会让我连接到端口。当我把它带回工作时,它是完美的。为什么?我还是要弄清楚。但感谢大家的帮助!