如何使用netty设置最大并发连接数

时间:2017-10-20 13:18:19

标签: java netty

我从Netty Library开始,想要将可以在我的服务器上连接的客户端数量设置为4,我该怎么办?

由于

2 个答案:

答案 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处理程序相同的方式实现它。