查看以下测试:
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
问题是:
conn1.connect(addr)
没有失败,虽然服务器端口还没有绑定?assch.accept()
不接受已经挂起的客户端连接?我读过JDK的javadoc并找不到答案。