2010-11-22 44 views
1

我對新的java套接字NIO做了一點研究。我正在使用MINA構建一個模擬服務器,該服務器接受來自多個客戶端(大約1000個)的連接並處理從它們接收到的數據。我還設置了客戶端模擬器,它可以創建大約300個客戶端連接,並使用線程將數據發送到服務器。結果是一些連接被服務器中止。代碼如下java.nio中的選擇器可以一次選擇多少個連接?

try { 
    listener = new NioSocketAcceptor(ioThread); 

    listener.getFilterChain().addLast("codec", new ProtocolCodecFilter(new MessageCodecFactory())); 
    listener.getFilterChain().addLast("thread", new ExecutorFilter(100, 150)); 
    listener.setHandler(new IncomingMessageHandler(serverMessageHandler)); 

    listener.bind(new InetSocketAddress(PORT)); 
} 
catch (IOException ioe) { 
} 

這裏是處理程序,會議是我從客戶

@Override 
public void sessionCreated(IoSession session) throws Exception { 
    new Session(session.getRemoteAddress(), handler, session); 
    super.sessionCreated(session); 
} 

@Override 
public void messageReceived(IoSession session, Object message) 
    throws Exception { 

    Message m = Message.wrap((MessagePOJO)message); 
    if (m != null) { 
    Session s = SessionManager.instance.get(session.getRemoteAddress()); 
    if (s != null) { 
    s.submit(m); 
    ArmyServer.instance.tpe.submit(s); 
    } 
    } 

    super.messageReceived(session, message); 
} 

@Override 
public void sessionClosed(IoSession session) throws Exception { 
    Session s = SessionManager.instance.get(session.getRemoteAddress()); 
    if (s != null) 
    s.disconnect(); 
    super.sessionClosed(session); 
} 

每個連接的客戶端模擬器,SIZE〜300級 - 400

 for (int i = 0; i < SIZE; i++) { 
    clients[i] = new Client(i); 
    pool[i] = new Thread(clients[i]); 
    pool[i].start(); 
} 

所以問題是Mina每次可以接受多少個連接?或者在我的代碼中有任何錯誤?

+0

糟糕,我確定我在草稿預覽中看到了正確的格式,但事實證明是這樣的。對不起,這個爛攤子... – noob 2010-11-22 08:34:55

回答

3

您可能只是超載服務器。由於操作系統和CPU的限制,它一次只能接受如此多的請求。一旦有更多的掛起請求比ServerSocket上的監聽隊列長度,連接將被拒絕。

嘗試增加偵聽隊列長度(ServerSocket.bind()中的積壓參數)和/或在客戶端for循環中添加少量sleep()。

我不知道Mina的詳細信息,但是您可能還想確保除了有多少個線程處理消息之外,還有多個線程可以接受。

+0

Upvoted,但你不應該加入聯網代碼睡覺。它只喜歡問題,它不解決問題。 – EJP 2017-09-05 01:24:04