实测结果:
单Channel对应320个客户端没有问题,超过了就会报错,可能和Channel下key处理大小有关?
客户端报错:
java.net.ConnectException: Connectionrefused: connect
at sun.nio.ch.Net.connect0(Native Method)
at sun.nio.ch.Net.connect(Unknown Source)
at sun.nio.ch.Net.connect(Unknown Source)
at sun.nio.ch.SocketChannelImpl.connect(Unknown Source)
at java.nio.channels.SocketChannel.open(Unknown Source)
atcom.xiaolv.sfniocli.StringBasedClient.connect(StringBasedClient.java:209)
atcom.xiaolv.sfniocli.TestClient$runThread.run(TestClient.java:30)
at java.lang.Thread.run(Unknown Source)
服务端没有看到报错:
此时的实现方式为:
客户端: SocketChannel.open( new InetSocketAddress(serverHostname, serverPort ) );
然后在一个thread里面监听,socketChannel.read(byteBuffer )
服务端: 在Thread的run方法里面:
ssc =ServerSocketChannel.open();
ssc.configureBlocking( false);
ssc.socket().bind( newInetSocketAddress( targetPort ) );
port = targetPort;
StackOverFlow对此的解释为:
1. 短时内的并发只和OS and CPU limits有关;
2. 当请求超过ServerSocketChannel的监听队列长度时,则拒绝访问;
3. selector本身可以支持至少10k的connection;
StackOverFlow给出的解决方法有:
1. 每个线程之间隔1秒,运行500次,不报错,OK;
2. 修改监听队列最大长度 the backlog parameter in ServerSocket.bind()
3. 增加ServerSocketChannel的Thread,怎样增加?不用加端口吧