我正在编写代理并拥有以下代码:
Socket conUser;
Socket conDest;
try{
ServerSocket ss = new ServerSocket(Integer.parseInt(p.getProperty("proxy.port")));
while(true){
//Connect to user
conUser = ss.accept();
BufferedReader inputFromUser = new BufferedReader(new InputStreamReader(conUser.getInputStream()));
BufferedWriter outputToUser = new BufferedWriter(new OutputStreamWriter(conUser.getOutputStream(), "UTF8"));
//Get user request
StringBuffer req = new StringBuffer();
getUserRequest(inputFromUser, req);
System.out.println("User requested the following:");
System.out.println(req);
//Connect to server
InetAddress a = InetAddress.getByName(determineHost(req));
conDest = new Socket(a,80);
//Send request to server
BufferedWriter outputToServer = new BufferedWriter(new OutputStreamWriter(conDest.getOutputStream(), "UTF8"));
InputStreamReader inputFromServer = new InputStreamReader(conDest.getInputStream(), "UTF8");
outputToServer.write(req.toString());
outputToServer.flush();
System.out.println("==============================");
System.out.println("Server replied with the following:");
//Read reply from the server
//=========================================
int chars;
while ((chars = inputFromServer.read()) != -1) {
System.out.print((char)chars);
outputToUser.write(chars);
outputToUser.flush();
//serverReply.append(chars);
}
//Relay reply to user
//outputToUser.write(serverReply.toString());
//System.out.println(serverReply);
//outputToUser.flush();
conUser.close();
conDest.close();
}
}
catch (Exception e) {
System.err.println(e);
}
会发生什么:我建立连接并成功。我也发送请求,也成功了。我也得到了一个回复,并且能够加载整个页面的HTML,除了当它到达内容的末尾时,它似乎没有终止。
具体来说,我试图加载谷歌的主页并且分块传输达到0(即传输结束),因此应该没有更多的输入要读取,但这并没有导致循环停止读。对我来说同样奇怪的是,代理的几乎所有代码示例都使用了这个循环,并且假设它们有效,我看不出它们的代码与我的代码之间存在很大差异。
如何使循环正确终止?
编辑:对于记录,是的 - 我知道TCP连接应保持打开以处理进一步的连接。这与我遇到的问题无关。我需要让这个循环终止每个响应。答案 0 :(得分:1)
通常,在每个响应结束时,连接不关闭。创建TCP连接相对耗时,因此连接保持打开状态,随时可以发送下一个请求。
以下是几个解释性链接:
答案 1 :(得分:1)
如果要在收到HTTP响应后正确终止连接,那么简单的循环是不够的。您必须按照RFC 2616的消息长度一节中所述确定消息的结束,然后关闭连接。
但是,最好使用现有的库,例如内置的URLConnection
。