2010-11-22 4 views
1

Ich habe ein wenig über neue Java-Socket NIO recherchiert. Ich verwende MINA für den Aufbau eines simulierten Servers, der die Verbindung von vielen Clients (etwa 1000) akzeptiert und die von ihnen empfangenen Daten verarbeitet. Ich habe auch den Client-Simulator eingerichtet, der ungefähr 300 Client-Verbindungen erstellt und Daten über Thread an den Server sendet. Und das Ergebnis ist ein Teil der Verbindung wird vom Server abgebrochen. Code ist unterWie viele Verbindungen kann der Selektor in java.nio einzeln auswählen?

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) { 
} 

Und hier ist der Handler, ist Session meine Klasse für jede Verbindung vom Client

@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); 
} 

und der Client-Simulator, SIZE bis 300 - 400

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

So die Frage ist, wie viele Verbindungen kann Mina einzeln annehmen? Oder ist in meinem Code etwas falsch?

+0

Hoppla, ich bin mir sicher, dass ich die korrekte Formatierung in der Entwurfsvorschau gesehen habe, aber es stellte sich so heraus. Sorry für das Chaos ... – noob

Antwort

2

Aus dem, was ich sehen kann, gibt es keine dokumentierte Begrenzung, wie viele Kanäle ein Selektor auswählen kann. In der Regel wird es ein Implementierungslimit für Integer.MAX_VALUE oder etwas Ähnliches geben. Für diesen speziellen Fall gehe ich davon aus der Grenze liegt darin, wie die SelectorProvider implementiert ist, und ich wette, es auf den meisten JVMs nativer ist ...

Verwandte Frage:

Verwandte Artikel :

3

Sie können nur den Server überlasten. Es wird nur in der Lage sein, aufgrund von Betriebssystem- und CPU-Beschränkungen so viele Anfragen gleichzeitig zu akzeptieren. Sobald mehr Anforderungen als die Listenwarteschlangenlänge auf dem ServerSocket anstehen, werden Verbindungen zurückgewiesen.

Versuchen Sie, die Länge der Listenwarteschlange zu erhöhen (den Parameter backlog in ServerSocket.bind()) und/oder fügen Sie eine kleine Menge sleep() im Client für die Schleife hinzu.

Ich kenne die Details von Mina nicht, aber Sie sollten auch sicherstellen, dass Sie mehr als 1 Thread akzeptieren, zusätzlich zu der Anzahl der Threads, mit denen Sie Nachrichten bearbeiten.

+0

Upvoted, aber Sie sollten nicht schlafen in Netzwerkcode hinzufügen. Es liebt nur Probleme, es löst sie nicht. – EJP

Verwandte Themen