1. 程式人生 > >關於ServerSocketChannel支援的最大連線數測試與分析

關於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,怎樣增加?不用加埠吧