我从Netty Library开始,想要将可以在我的服务器上连接的客户端数量设置为4,我该怎么办?
由于
答案 0 :(得分:1)
最简单的方法是编写自己的处理程序,以静态整数计算连接的客户端。
这样的事情:
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--;
}
}
修改强>
你应该记住,你必须使用一个线程否则可能会导致一些问题(竞争条件)。如果必须使用多个线程,则将int更改为AtomicInteger或在static int上使用synchronized关键字。
答案 1 :(得分:1)
您无法配置netty来限制传入连接的数量。但是,您可以在打开后立即关闭超出限制的连接。 实现这一目标的方法很少。
第一个就像上面的例子一样。您需要在管道的开头添加ConnectionCounter
处理程序。但是,您需要使用AtomicInteger
而不是int connections
并在检查前递增计数器(以避免竞争条件问题):
@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.请记住,此处理程序是可共享的,您只需要创建它的一个实例。否则,您需要将connections
字段设为静态。
另一种选择是使用单线程EventLoop
。正如您所期望的只有4个连接 - 可以使用1 EventLoop
轻松处理它们:
new ServerBootstrap().group(bossGroup, new EpollEventLoopGroup(1));
因此,您只有1个工作线程可以在ConnectionCounter
处理程序代码之上使用,但没有AtomicInteger
。
最后一个选项是 - DefaultChannelGroup
。但是,它内部使用ConcurrentMap<ChannelId, Channel>
。因此,您可以使用与ConnectionCounter
处理程序相同的方式实现它。