2016-07-17 8 views
0

に私は(ちょうど何かをしようとして)次のように特定のポートをリッスンするようにしようとしています小さなコード書かれていた:のSocketException:ソケットが(受け入れで閉鎖)のServerSocket

public class Test { 

    public static class MyThread extends Thread { 
     ServerSocket ss = null; 
     public MyThread(int port){ 
      try { 
       ss = new ServerSocket(port); 
      } catch (IOException e) { 
       System.out.println("Exception in assigning port : " + port); 
       e.printStackTrace(); 
      } 
     } 
     public void stopListening(){ 
      try { 
       ss.close(); 
      } catch (IOException e) { 
       System.out.println("Exception in closing socket : " + ss.getLocalPort()); 
       e.printStackTrace(); 
      } 
     } 
     public void run(){ 
      try { 
       ss.accept(); 
      } catch (IOException e) { 
       System.out.println("Exception in listening on port : " + ss.getLocalPort()); 
       e.printStackTrace(); 
      } 
     } 
    } 

    public static void main(String[] args) { 
     List<MyThread> threadList = new LinkedList<>(); 
     for (int i = 50000; i < 50005; i++) { 
      MyThread thread = new MyThread(i); 
      threadList.add(thread); 
      thread.start(); 
     } 
     try { 
      Thread.sleep(5000); 
     } catch (InterruptedException e2) { 
      e2.printStackTrace(); 
     } 
     for (MyThread myThread : threadList) { 
      myThread.stopListening(); 
     } 
    } 
} 

をしかし、私は起動することができませんでもシングルスレッド、すべてのss.accept()のために、私は得続ける:

例外をポートで待機中:

私はfolloを取得しますそれぞれの場合の翼例外:

java.net.SocketException: socket closed 
    at java.net.DualStackPlainSocketImpl.accept0(Native Method) 
    at java.net.DualStackPlainSocketImpl.socketAccept(Unknown Source) 
    at java.net.AbstractPlainSocketImpl.accept(Unknown Source) 
    at java.net.PlainSocketImpl.accept(Unknown Source) 
    at java.net.ServerSocket.implAccept(Unknown Source) 
    at java.net.ServerSocket.accept(Unknown Source) 
    at com.harman.hlacssmdw.Test$MyThread.run(Test.java:40) 

私がテーマのどれもが占有されていない、netstatコマンド-anpを使用して50000から50000までのポートをチェックします。

私は何が間違っているのか理解できません、助けてください!

+0

プログラムを開始して5秒後に例外が発生しますか?あなたがstopListening()を呼び出した頃については正しいでしょうか? –

+0

はい私は約5秒後にこれを取得しますが、行のss.accept() ' –

+0

でソケットを閉じるのと同じように 'accept()'を呼び出すため例外がスローされます。正確に何が起こると思いますか?そしてなぜあなたは 'accept()'を呼び出して戻り値を無視していますか?そしてここで「聞くことができない」ことはありません。あなたが尋ねていることが不明で、あなたのコードがやっていると思われることが、まだやっていないことです。 – EJP

答えて

4

ServerSocketは、stopListening()を呼び出して閉じるため、閉じられています。これにより、そのServerSocketのaccept()を待っているすべてのスレッドに対する例外が発生します。

+0

そして、アプリケーションが開始してから5秒後にこれが起こるという事実は、これの証拠を裏付けるものです。彼はスレッドで 'stopListening()'を呼び出す前に5秒待つからです。 –

+0

lottに感謝しますが、なぜソケットを閉じると例外がスローされるのか、なぜss.accept()が例外をスローするのかについても説明できますか?それは本当に役に立つでしょう –

+0

@FurquanAhmedそれはあなたがそれを使用し続けている間にソケットを閉じたので例外をスローし、 'accept()'が例外をスローする原因は同じです。なぜあなたが驚いているのか分かりません。 – EJP

関連する問題