Java中的代理:读取输入流时的套接字异常

时间:2014-06-12 08:54:47

标签: java exception proxy inputstream http-request

我在Java中实现一个简单的代理服务器。我通过以下代码片段中的clientSocket读取浏览器的请求。然后我打开一个输入流并通过byte [] buffer读取响应。

我在阅读本地服务器上运行的特定网页时遇到错误。终止的特定点是行int n = bis.read[buffer];有人可以指出导致它的原因以及如何纠正它吗?

其他信息:我在SwingWorker对象中运行此方法(可能与其无关)此外,forwardRequest也会转发截获的请求。

如果您还需要其他任何内容,请向我发送更新或评论

堆栈跟踪:

ERROR
java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:189)
at java.net.SocketInputStream.read(SocketInputStream.java:121)
at java.net.SocketInputStream.read(SocketInputStream.java:107)
at Networker.doInBackground(Networker.java:67)
at Networker.doInBackground(Networker.java:25)
at javax.swing.SwingWorker$1.call(SwingWorker.java:296)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
at java.util.concurrent.FutureTask.run(FutureTask.java:166)
at javax.swing.SwingWorker.run(SwingWorker.java:335)


@Override
protected Void doInBackground() throws Exception {
    System.out.println("Starting the SimpleProxyServer ...");

    while (true) {
        clientSocket = serverSocket.accept();
        InputStream bis = clientSocket.getInputStream();

        // reading the request and put it into buffer
        //BufferedReader br =new BufferedReader(new InputStreamReader(bis));
        try {
            n = bis.read(buffer);
        } catch (Exception e) {
            System.err.println("ERROR");
            e.printStackTrace();
        }
        forwardReq(); //this forwards the intercepted request
    }
}

1 个答案:

答案 0 :(得分:0)

我现在重新阅读了您的问题,我认为我可能找到了您的问题。

来自What's causing my java.net.SocketException: Connection reset? 我发现connection resetconnection reset by peer之间存在差异。

connection reset消息表示您突然关闭了连接(并且通过对等方意味着另一方关闭了它)。由于在服务器上抛出异常,所以 问题出在服务器代码中。

我相信你的未封闭流可能是个问题。 您的程序只能使用有限数量的资源。当你打开一个流并且不要关闭它时, 程序会认为您仍在使用流,并且不会释放已分配的资源。 因此,使用多个客户端进行测试可以分配所有服务器的资源,并且当新客户端连接时 其中一个输入流将被强制关闭(因为没有资源是免费的)。这可能会导致连接强制,从而导致重置连接异常。

这不是100%的绝对答案,但由于我无法测试您的所有代码,因此值得尝试。如果您知道您正在测试多个客户端,我肯定会建议您尝试此解决方案。