2014-01-26 42 views
1

我正在嘗試使線程聊天服務器正常工作。但是我的套接字正在關閉,我不知道它爲什麼。Java SocketException。它爲什麼關閉?

在服務器類我創建了一個新的ClientHandler的

addHandler(new ClientHandler(this, incoming)); 

addHandler操作開始線程,並增加了新的ClientHandler的到服務器的ArrayList。 傳入是客戶端套接字。

public ClientHandler(Server serverArg, Socket sockArg) { 
    server = serverArg; 
    client = sockArg; 
    System.out.println(client.isClosed()); 
} 

沒有什麼所謂的

之間

public void run() { 
    try { 
     System.out.println(client.isClosed()); 
     in = new Scanner(client.getInputStream()); 
     out = new PrintWriter(client.getOutputStream(), true); 
     announce(); 
     System.out.println("Waiting for input"); 
     boolean done = false; 
     while(!done && in.hasNextLine()) { 
      System.out.println("There is input!"); 
      server.broadcast(clientName + ": " + in.nextLine()); 
     } 
    } catch (Exception e) { 
     System.out.println(e.toString()); 
    } 
} 
當我運行這段代碼。這是輸出:

false 
true 
java.net.SocketException: Socket is closed 

爲什麼在創建此類之後立即關閉/在啓動之前?

+0

你能複製你的完整代碼嗎 –

+0

還不知道爲什麼它不起作用。我現在修好了,但似乎沒有任何改變。即使我將代碼轉換爲上述狀態,它仍然有效。 – user3237823

+0

我玩過的東西:實現Runnable,在ClientHandler中擴展Thread。 – user3237823

回答

1

當您添加處理程序和調用run()方法時,連接正在由您的代碼關閉。我建議你在JDK的close方法中添加一個斷點並查看它的調用方式。或者在添加處理程序後查看代碼。

+0

這並沒有最終解決我的代碼。在我添加處理程序的代碼和運行run()方法的代碼之間沒有任何東西被調用。但它是最有用的!我認爲這個問題與線程有關。 – user3237823

+0

如果你斷點close()方法,你應該看到它被調用的地方。 –

-1

您可以使用wireshark或tcpdump等網絡嗅探器。

要了解是否由於服務器端導致連接中斷。

我想也許客戶端關閉連接。

+0

否。當前應用程序已關閉套接字。它與網絡或對等無關。你的第二句和第三句相互矛盾。請參閱@ PeterLawrey的答案。 – EJP

相關問題