[英]Proxy in Java : Socket Exception while reading an inputstream
我正在用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
}
}
我現在重新閱讀您的問題,我想我可能已經找到您的問題了。
是什么導致我的java.net.SocketException:連接重置? 我發現了connection reset
和connection reset by peer
之間的區別。
connection reset
消息表示您突然關閉了連接(對等體意味着另一方關閉了該連接)。 由於在服務器上引發了異常,因此問題出在服務器代碼內。
我相信您未公開的信息流可能是一個問題。 程序只能使用有限數量的資源。 當您打開流而不關閉它時,程序會認為您仍在使用流,並且分配的資源將不會被釋放。 因此,使用多個客戶端進行測試可能會分配服務器的所有資源,並且當新客戶端連接其中一個輸入流時,將強制關閉(因為沒有可用資源)。 這可能會導致強制連接 ,從而導致重置連接異常。
這不是100%的絕對答案,但是由於我無法測試您的所有代碼,因此值得嘗試。 如果您知道要與多個客戶端進行測試,則絕對建議您嘗試此解決方案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.