Counterintuinive AsynchronousSocketChannel行为

时间:2012-07-13 19:02:21

标签: java nio2

查看以下测试:

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()不接受已经挂起的客户端连接?
  3. 我读过JDK的javadoc并找不到答案。

0 个答案:

没有答案