【问题标题】:Proxy in Java : Socket Exception while reading an inputstreamJava中的代理:读取输入流时出现套接字异常
【发布时间】:2014-08-02 12:44:03
【问题描述】:

我正在用 Java 实现一个简单的代理服务器。我在下面的代码 sn-p 中通过 clientSocket 读取来自浏览器的请求。然后我打开一个输入流并通过 byte[] 缓冲区读取响应。

我在读取本地服务器上运行的特定网页时遇到错误。终止的特定点是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
    }
}

【问题讨论】:

  • 当您尝试阅读时,连接已经关闭(重置):) 当我没有完整的代码时,很难知道为什么。
  • 我认为你和stackoverflow.com/questions/62929/…有同样的问题
  • @Pphoenix 你认为每次循环通过在循环中重新初始化它来完成它的迭代时,我可以以某种方式重新打开它吗?
  • 评论太长了,所以我添加了答案
  • 你为什么只执行一次读取,忽略读取计数和读取的数据,然后转发请求,然后阻塞接受另一个连接,而不关闭前一个连接?

标签: java exception proxy inputstream http-request


【解决方案1】:

我现在重新阅读了您的问题,我想我可能发现了您的问题。

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

connection reset 消息表示你突然关闭了连接(对等表示对方关闭了它)。由于服务器抛出异常, 问题出在您的服务器代码中。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-06
    • 2012-10-24
    • 1970-01-01
    • 1970-01-01
    • 2016-02-11
    • 1970-01-01
    • 1970-01-01
    • 2012-08-16
    相关资源
    最近更新 更多