2017-10-20 8 views
0

Je commence avec la bibliothèque Netty et je veux définir à 4 le nombre de clients qui peuvent se connecter sur mon serveur, comment puis-je faire?Comment définir les connexions simultanées maximales avec netty

Merci

+0

selon cette réponse: https://stackoverflow.com/a/19045001/5515060, ce n'est pas possible – Lino

+0

D'accord ... Je vais essayer quelque chose d'autre. Je vous remercie – Papaya

Répondre

1

La façon la plus simple serait d'écrire votre propre gestionnaire qui compte les clients connectés dans un entier statique.

Quelque chose comme ceci:

import io.netty.channel.ChannelHandler.Sharable; 
import io.netty.channel.ChannelHandlerContext; 
import io.netty.channel.ChannelInboundHandlerAdapter; 

@Sharable 
public class ConnectionCounter extends ChannelInboundHandlerAdapter { 

    private static int connections = 0; 

    @Override 
    public void channelActive(ChannelHandlerContext ctx) throws Exception { 
     if(connections < 4) { 
      connections++; 
      super.channelActive(ctx); 
     } else 
      ctx.close(); 
    } 

    @Override 
    public void channelInactive(ChannelHandlerContext ctx) throws Exception { 
     super.channelInactive(ctx); 
     connections--; 
    } 
} 

EDIT

Vous devez garder à l'esprit que vous devez utiliser un fil sinon il pourrait causer des problèmes (condition de course). Si vous devez utiliser plusieurs thread, changez l'int en AtomicInteger ou utilisez le mot-clé synchronized sur l'int statique.

1

Vous ne pouvez pas configurer netty pour limiter le nombre de connexions entrantes. Mais vous pouvez fermer les connexions au-dessus de votre limite juste après leur ouverture. Il y a peu de moyens d'y parvenir.

Le premier serait comme dans l'exemple ci-dessus. Vous devez ajouter au début de votre pipeline le gestionnaire ConnectionCounter. Cependant, vous devez utiliser AtomicInteger au lieu de int connections et incrémenter le compteur avant l'arrivée (pour éviter les problèmes de conditions de course):

@Sharable 
public class ConnectionCounter extends ChannelInboundHandlerAdapter { 

private final AtomicInteger connections = new AtomicInteger(); 

@Override 
public void channelActive(ChannelHandlerContext ctx) throws Exception { 
    int val = connections.incrementAndGet(); 
    if (val <= 4) { 
     super.channelActive(ctx); 
    } else { 
     ctx.close(); 
    } 
} 

@Override 
public void channelInactive(ChannelHandlerContext ctx) throws Exception { 
    super.channelInactive(ctx); 
    connections.decrementAndGet(); 
} 
} 

P. S. Avoir à l'esprit ce gestionnaire est partageables et vous devez créer seulement 1 instance. Sinon, vous devez rendre le champ connections statique.

Une autre option consisterait à utiliser EventLoop à un seul thread. Comme vous attendez seulement 4 connexions - ils pourraient facilement être manipulés avec 1 EventLoop:

new ServerBootstrap().group(bossGroup, new EpollEventLoopGroup(1)); 

Ainsi vous avez seulement 1 thread de travail ci-dessus, vous pouvez utiliser ConnectionCounter code de gestionnaire mais sans AtomicInteger.

Et la dernière option serait - DefaultChannelGroup. Cependant, à l'intérieur, il utilise ConcurrentMap<ChannelId, Channel>. Vous pouvez donc l'implémenter de la même manière que le gestionnaire ConnectionCounter.