java - 如何阅读服务器回复而不被它阻止?

标签 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,但当读取到达内容末尾时,读取似乎并未终止。

具体来说,我正在尝试加载 Google 的主页,并且分块传输达到 0(即更改传输结束),因此应该没有更多输入可供读取,但这并没有导致循环停止阅读。对我来说还奇怪的是,几乎所有代理的代码示例都使用这个循环,并且假设它们有效,我看不出它们的代码和我的代码之间有太大差异。

如何使循环正确终止?

编辑:郑重声明,是的 - 我知道 TCP 连接应保持打开状态以处理进一步的连接。这与我遇到的问题无关。我需要让这个循环终止每个响应。

最佳答案

一般来说,连接在每次响应结束时不会关闭。创建 TCP 连接相对耗时,因此连接保持打开状态,以便您发送下一个请求。

这里有几个解释性链接:

关于java - 如何阅读服务器回复而不被它阻止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5714642/

相关文章:

JavaFX- float 菜单

java - 我可以保证静态初始化程序在 Java 中的运行顺序吗?

Java 8 Streams - 对元组流进行分组

java - Nuance/NDEV 文本转语音 [导入声音文件]

java - 如何在 android 中使用 autocompleteTextView 执行 Trie 搜索?

Java更新语句问题

java - 在 java 中使用字符串格式打印列

java - 从文本文件输出信息时遇到问题

java - Jsoup从span类获取信息

java - GridPane 不跨越整个 VBox