關於ServerSocketChannel支援的最大連線數測試與分析
實測結果:
單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,怎樣增加?不用加埠吧