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
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
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.
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
.
selon cette réponse: https://stackoverflow.com/a/19045001/5515060, ce n'est pas possible – Lino
D'accord ... Je vais essayer quelque chose d'autre. Je vous remercie – Papaya