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 楼答案
我现在重读了你的问题,我想我可能发现了你的问题
从What's causing my java.net.SocketException: Connection reset? 我发现了
connection reset
和connection reset by peer
之间的区别connection reset
消息意味着您突然关闭了连接(对等方意味着另一方关闭了连接)。由于异常是在服务器上引发的,因此 问题出在服务器代码中的某个地方我相信你未关闭的溪流可能是个问题。 您的程序只能使用有限的资源。当你打开一条小溪,却没有关闭它, 程序会认为您仍在使用流,分配的资源不会被释放。 因此,使用多个客户机进行测试可能会分配服务器的所有资源,以及在新客户机连接时 其中一个输入流将被强制关闭(因为没有可用的资源)。这可能会导致强制连接,导致重置连接异常
这不是一个100%绝对的答案,但由于我无法测试您的所有代码,这是一个值得尝试的想法。如果你知道你正在测试多个客户,我绝对建议你试试这个解决方案