0

重複の可能性:
DatagramChannel.close() が Windows でポートを開いたままにする

DatagramChanned をうまく利用しようとしていますが、アドレスを閉じた後もアドレスをバインドしており、次の例のように関数が実行を終了します。

このコードが出力される理由:

電話番号: 2

java.net.BindException: アドレスは既に使用されています: bind

 public static void main(String[] args) {

            java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            recever(1);
            recever(2);
        }
    });
}

    static void recever(int c) {
     try {        
        DatagramChannel chdata = DatagramChannel.open();

            int uport = 3111;
            int bufsize = 10;
         chdata.configureBlocking(false);
         Selector selector = Selector.open();

         chdata.bind(new InetSocketAddress(uport));
         ByteBuffer  bytbuf = ByteBuffer.allocate(bufsize);      
            chdata.register(selector, SelectionKey.OP_READ);

     int th = 0;
     int sn;

    while (true) {

        if (selector.select(1000) == 0){
                     System.out.println("\nTimeout");
            break;
        }

        Set readyKeys = selector.selectedKeys();
        Iterator iterator = readyKeys.iterator();
        while (iterator.hasNext()) {
           iterator.next();
            iterator.remove();

               bytbuf.clear();
               chdata.receive(bytbuf);
               th++;
               bytbuf.flip();
       //   dealwithincomingbuffer(bytbuf);
          }
       }    
      //  chdata.bind(null);
        chdata.close();

    } catch (IOException ex) {
        System.out.println("Call num: "+c+" \n  "+ex);
    }
  }
}
4

1 に答える 1

0

最終ブロックでソケットを閉じておらず、セレクターをまったく閉じていません。したがって、ソケットがまったく閉じられていない状況があります。

于 2012-12-12T10:54:08.780 に答える