我正在寫一個代理,並有以下代碼:如何在不阻止我的情況下閱讀服務器回覆?
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連接應保持開放以處理更多的連接。這與我遇到的問題無關。我需要得到這個循環來終止每個響應。
我相信,服務器認爲你可能想使同一插座上的其他請求。要麼你必須告訴它你不想這樣做,或者你有足夠的數據斷開連接(它會告訴你有多少期待) – 2011-04-19 10:07:10
,如果你使用的是> 0,而不是會發生什麼!= -1?我不確定這是否適用於read(),但它應該與read(char [],int,int)一起工作,因爲在後一種情況下,您要求輸入特定數量的字符,或者其他所有字符更少可用。零意味着沒有更多 - 這不完全相同「流端」,但似乎對我更好。 – richj 2011-04-19 10:21:39