2012-03-18 4 views
2

以下を1時間実行した後、閉鎖された住所:どのようにjava.net.BindExceptionを回避する:すでに使用中の

public class Mp extends JWindow implements MouseListener, MouseMotionListener { 
    public static Mp j; 
    private int serverPort = 0; 
    private ServerSocket serverSock = null; 
    private Socket sock = null; 

    public static void main(final String[] args) throws IOException, InterruptedException, Exception { 
    j = new Mp(); 
    j.setVisible(true); 
    j.waitForConnections(); 
    } 

    public void waitForConnections() { 
    while (true) { 
     try { 
     sock = serverSock.accept(); 
     System.out.println("[TCPMediaHandler]: Accepted new socket"); 
     TCPMediaHandler handler = new TCPMediaHandler(sock); 
     handler.start(); 
     } catch (IOException e) { 
     e.printStackTrace(System.err); 
     } 
    } 
    } 

    public Mp() throws IOException { 
    this.serverPort = 38891; 
    serverSock = new ServerSocket(serverPort); 
    serverSock.setReuseAddress(true); 
    //serverSock.setSoTimeout(500); 
    //serverSock.setSoLinger(true, 0); 
    System.out.println("[TCPMediaHandler]: Server started");  
     this.v1.setBackground(Color.BLACK); 
    this.v1.addMouseListener(this); 
    /* Close the window */ 
    this.addWindowListener(new WindowAdapter() { 
     public void windowClosing(WindowEvent we) { 
      System.exit(0); 
     } 
     }); 
    } 

私はそれがjava.net.BindExceptionで失敗し、同じことを再度実行すると、

$ java -cp /var/tmp/dist/Mp.jar test.Mp 
Exception in thread "main" java.net.BindException: Address already in use 
    at java.net.PlainSocketImpl.socketBind(Native Method) 
    at java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:353) 
    at java.net.ServerSocket.bind(ServerSocket.java:336) 
    at java.net.ServerSocket.<init>(ServerSocket.java:202) 
    at java.net.ServerSocket.<init>(ServerSocket.java:114) 
    at test.Mp.<init>(Mp.java) 
    at test.Mp.main(Mp.java) 

もう一度正常に実行されるまでに約3〜4分かかります。シャットダウン直後にどうすればいいですか?

フォローアップ:

$ netstat | grep 38891 
tcp  35  0 localhost:38891   localhost:37842   CLOSE_WAIT 
tcp  0  0 localhost:34955   localhost:38891   ESTABLISHED 
tcp  32  0 localhost:38891   localhost:37824   CLOSE_WAIT 
tcp  0  0 localhost:38891   localhost:34955   ESTABLISHED 

$ lsof -w -n -i tcp:38891 
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME 
xdg-scree 5254 sun 29u IPv4 231948  0t0 TCP *:38891 (LISTEN) 
xdg-scree 5355 sun 29u IPv4 231948  0t0 TCP *:38891 (LISTEN) 
xdg-scree 5455 sun 29u IPv4 231948  0t0 TCP *:38891 (LISTEN) 
telnet 7058 sun 3u IPv4 242987  0t0 TCP 127.0.0.1:34955->127.0.0.1:38891 (ESTABLISHED) 
sleep  9002 sun 29u IPv4 231948  0t0 TCP *:38891 (LISTEN) 
sleep  9005 sun 29u IPv4 231948  0t0 TCP *:38891 (LISTEN) 
sleep  9008 sun 29u IPv4 231948  0t0 TCP *:38891 (LISTEN) 

答えて

11

あなたはバインドが例外をスローした後、あなたのsetReuseAddressのは(真)すなわち、遅すぎると呼ばれていることがわかります。

バインドされていないServerSocketを作成し、再利用可能にしてから3段階でバインドすることができます。

ServerSocket ss = new ServerSocket(); 
ss.setReuseAddress(true); 
ss.bind(new InetSocketAddress(12345)); 
+0

ありがとうございました!私はあなたの大きな助言に従って試しました。しかし、私はまだそれを修正することができませんでした。私の編集フォローアップセクションの上をご覧ください。 ESTABLISHEDはまだ表示されていませんが、実際には何も表示されていません。しかし、私はまだ 'telnet localhost thatport'を実行することができます – YumYumYum

+1

@YumYumYum CLOSE_WAIT状態のポートがあることは、そのnetstatを実行したときにアプリケーションがまだ実行中だったことを示します。 – EJP

+0

私のシナリオでは、ポート番号を気にしなかったので、使用することができます ServerSocket myServer = new ServerSocket(0); final int port = myServer.getLocalPort();その場合、 – tobi42

1

私は私のプログラムの一つで同様の問題があったが、それは、私はちょうど実際に私のIDEからプログラムのインスタンス実行していたことを終わった - 私は気づいていませんでした。バックグラウンドで実行中のものがないことを常に確認してください。

関連する問題