如何在不阻止我的情况下阅读服务器回复?

时间:2011-04-19 09:58:31

标签: java

我正在编写代理并拥有以下代码:

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连接应保持打开以处理进一步的连接。这与我遇到的问题无关。我需要让这个循环终止每个响应。

2 个答案:

答案 0 :(得分:1)

通常,在每个响应结束时,连接关闭。创建TCP连接相对耗时,因此连接保持打开状态,随时可以发送下一个请求。

以下是几个解释性链接:

答案 1 :(得分:1)

如果要在收到HTTP响应后正确终止连接,那么简单的循环是不够的。您必须按照RFC 2616的消息长度一节中所述确定消息的结束,然后关闭连接。

但是,最好使用现有的库,例如内置的URLConnection