2010-11-22 8 views
1

新しいJavaソケットNIOについて少し研究しました。私は多くのクライアント(約1000)からの接続を受け取り、それらから受信したデータを処理するシミュレートされたサーバを構築するためにMINAを使用しています。また、約300のクライアント接続を作成し、スレッドを使用してサーバーにデータを送信するクライアントシミュレータを設定しました。その結果、サーバーによって接続の一部が中断されます。だから、400java.nioのセレクタは一度にどれだけ選択できますか?

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

- コードが

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からの各接続のための私のクラスであります問題は、ミナが一度にどれくらいの接続を受け入れることができるかということです。それとも、コードに間違いがありますか?

+0

暫定プレビューで正しい書式設定を見たことがありますが、このようになりました。混乱のために申し訳ありません... – noob

答えて

2

セレクタが選択できるチャンネルの数には文書化された制限はありません。通常、Integer.MAX_VALUEなどの実装制限があります。

関連記事:この特定のケースでは、...

関連の質問に私は限界がSelectorProviderが実装されている方法であると仮定し、私はそれがほとんどのJVMのネイティブだ賭けます:

3

サーバーが過負荷になっている可能性があります。 OSとCPUの制限により、一度に多くのリクエストを受け入れることができます。 ServerSocketの待機キューの長さよりも保留中の要求が多くなると、接続は拒否されます。

リッスンキューの長さ(バックログパラメータServerSocket.bind())を増やしたり、クライアントforループに少量のsleep()を追加してみてください。

ミーナの詳細はわかりませんが、メッセージを処理するスレッドの数に加えて、1つ以上のスレッドが受け付けていることを確認することもできます。

+0

Upvoted、しかしあなたはネットワーキングコードに眠りを加えるべきではありません。それは問題を愛するだけで、解決しません。 – EJP

関連する問題