我對Stack Overflow有點新,所以如果我做了任何不正確的事情,請隨時告訴我。我還沒有發現另一篇文章,以一種對我有意義的方式來解決這個問題。多線程Java代理服務器
所以我的最終目標是用Java編寫一個多線程HTTP代理服務器,但作爲第一步,我只是試圖將通過瀏覽器建立的連接的輸入流寫入窗口。
這裏是我的代碼:
private static ServerSocket welcomeSocket;
private static Socket connectionSocket;
private static Socket clientSocket;
private static OutputStream clientOutput;
private static InputStream proxyInput;
private static BufferedReader reader;
private static InetSocketAddress clientStream;
public static void main(String[] args) throws IOException, URISyntaxException {
// Create socket, port 12345, for incoming request
welcomeSocket = new ServerSocket(12345);
while(true){
try(Socket clientSocket = welcomeSocket.accept()){
BufferedReader reader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()));
Thread t = new Thread(){
public void run(){
System.out.println("running\n");
try{
System.out.println("trying\n");
String lineIn;
while((lineIn = reader.readLine()) != null){
System.out.println("writing\n");
writer.write(lineIn);
writer.newLine();
}
}
catch(IOException i){
try {
Logger.getLogger(EECS325_Project1.class.getName()).log(Level.SEVERE, null, i);
throw i;
} catch (IOException ex) {
Logger.getLogger(EECS325_Project1.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
};
t.start();
}
}
}
然而,當我去到本地主機:12345在我的瀏覽器,我得到以下異常:
Nov 04, 2015 9:53:44 AM eecs325_project1.EECS325_Project1$1 run
SEVERE: null
java.net.SocketException: socket closed
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
at java.net.SocketInputStream.read(SocketInputStream.java:170)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
at java.io.InputStreamReader.read(InputStreamReader.java:184)
at java.io.BufferedReader.fill(BufferedReader.java:161)
at java.io.BufferedReader.readLine(BufferedReader.java:324)
at java.io.BufferedReader.readLine(BufferedReader.java:389)
at eecs325_project1.EECS325_Project1$1.run(EECS325_Project1.java:46)
大部分帖子說,出現這種異常時關閉讀寫器,有效關閉插座。但是,我絕不會關閉閱讀器,書寫器或套接字。
任何幫助將不勝感激!
「但是,我從來沒有關閉過讀卡器,寫卡器或插座。」你這樣做,當try-with-resources完成時:'try(Socket clientSocket = welcomeSocket.accept()){'。 –
@AndyTurner謝謝!我現在看到了這個問題,但我不確定解決問題的恰當方法。我添加了一個finally關閉套接字的語句,如果它不爲null,但它似乎在此之前關閉。有什麼想法嗎? – Haley
您需要將套接字「切換」到線程。在成功調用start之後,將對套接字的本地引用設置爲null,以便它不再在finally外部塊中關閉。由於線程現在擁有套接字,因此您需要確保_thread_關閉finally塊中的套接字。 – jtahlborn