有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java中的代理:读取inputstream时发生socket异常

我正在用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) 个答案

  1. # 1 楼答案

    我现在重读了你的问题,我想我可能发现了你的问题

    What's causing my java.net.SocketException: Connection reset? 我发现了connection resetconnection reset by peer之间的区别

    connection reset消息意味着您突然关闭了连接(对等方意味着另一方关闭了连接)。由于异常是在服务器上引发的,因此 问题出在服务器代码中的某个地方

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

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