3

次のテストを見てください。

public class AsynchronousSocketTest {
  static PrintStream out=System.out;
  public static  void main(String[] args) throws IOException, InterruptedException, ExecutionException {
    int port=9008;
    InetSocketAddress addr=new InetSocketAddress("localhost", port);
    AsynchronousChannelGroup acg=AsynchronousChannelGroup.withThreadPool(Executors.newFixedThreadPool(1));
    // server not working, client trying to connect
    AsynchronousSocketChannel conn1=AsynchronousSocketChannel.open(acg);
    Future<Void> connfut1 = conn1.connect(addr); // no error, question 1
    Thread.sleep(100);
    out.println("connected1:"+connfut1.isDone());
    // start server
    AsynchronousServerSocketChannel assch=AsynchronousServerSocketChannel.open(acg);
    assch.bind(addr);
    // accept
    Future<AsynchronousSocketChannel> accfut1 = assch.accept();
    Thread.sleep(100);
    out.println("accepted1:"+accfut1.isDone());  // did not accept, question 2
    out.println("connected1:"+connfut1.isDone());  // did not connected
    // try new client connection
    AsynchronousSocketChannel conn2=AsynchronousSocketChannel.open(acg);
    Future<Void> connfut2 = conn2.connect(addr);
    Thread.sleep(100);
    out.println("connected2:"+connfut2.isDone()); // connected
    out.println("accepted1:"+accfut1.isDone());  // accepted
    // accept
    Future<AsynchronousSocketChannel> accfut2 = assch.accept();
    Thread.sleep(100);
    out.println("accepted2:"+accfut2.isDone()); // not accepted
    out.println("connected1:"+connfut1.isDone()); // still waiting
  }
}

Windows Java 1.7.0_05 では、次のように表示されます。

 connected1:false
 accepted1:false
 connected1:false
 connected2:true
 accepted1:true
 accepted2:false
 connected1:false

質問は次のとおりです。

  1. conn1.connect(addr)サーバーポートがまだバインドされていないのに、最初のポートが失敗しないのはなぜですか?
  2. assch.accept()最初のクライアント接続が保留中のクライアント接続を受け入れないのはなぜですか?

JDK の javadoc を読みましたが、答えが見つかりませんでした。

4

0 に答える 0