我在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
}
}
答案 0 :(得分:0)
我现在重新阅读了您的问题,我认为我可能找到了您的问题。
来自What's causing my java.net.SocketException: Connection reset?
我发现connection reset
和connection reset by peer
之间存在差异。
connection reset
消息表示您突然关闭了连接(并且通过对等方意味着另一方关闭了它)。由于在服务器上抛出异常,所以
问题出在服务器代码中。
我相信你的未封闭流可能是个问题。 您的程序只能使用有限数量的资源。当你打开一个流并且不要关闭它时, 程序会认为您仍在使用流,并且不会释放已分配的资源。 因此,使用多个客户端进行测试可以分配所有服务器的资源,并且当新客户端连接时 其中一个输入流将被强制关闭(因为没有资源是免费的)。这可能会导致连接强制,从而导致重置连接异常。
这不是100%的绝对答案,但由于我无法测试您的所有代码,因此值得尝试。如果您知道您正在测试多个客户端,我肯定会建议您尝试此解决方案。