我正在用Java实现一个简单的代理服务器。我在下面的代码片段中通过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
}
}发布于 2014-06-12 12:31:34
我现在重读了你的问题,我想我可能已经找到你的问题了。
在What's causing my java.net.SocketException: Connection reset?中,我发现了connection reset和connection reset by peer之间的区别。
connection reset消息意味着您突然关闭了连接(通过对等方意味着另一方关闭了它)。由于异常是抛出在服务器上的,所以问题就在服务器代码的某个地方。
我相信你的未封闭的溪流可能是个问题。只有有限的资源可供您的程序使用。当您打开一个流而不关闭它时,程序会认为您仍然在使用该流,并且分配的资源不会被释放。因此,使用多个客户端进行测试可能会分配服务器的所有资源,并且当一个新客户端连接时,一个输入流将被强制关闭(因为没有空闲的资源)。这可能导致强制连接,从而导致重置连接异常。
这不是一个百分之百的绝对答案,但由于我不能测试您所有的代码,这是一个值得一试的想法。如果您知道您正在使用多个客户端进行测试,我肯定会建议您尝试此解决方案。
https://stackoverflow.com/questions/24180203
复制相似问题