2017-10-20 5775 views
0

我開始使用Netty Library並且希望將可以連接到我的服務器的客戶端數設置爲4,我該怎麼辦?如何使用netty設置最大併發連接數

感謝

+0

根據這個答案:https://stackoverflow.com/a/19045001/5515060,它不可能 – Lino

+0

好吧...我會嘗試其他的東西。謝謝 – Papaya

回答

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

您不能配置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.心目中這個處理器是可共享的,你只需要創建1它的實例。否則,您需要使connections字段靜態。

另一種選擇是使用單線程EventLoop。當你想到只有4個連接 - 他們可以很容易地用1 EventLoop處理:

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

因此你只有你可以使用上面的ConnectionCounter處理程序代碼,但沒有AtomicInteger 1個工作者線程。

而最後的選項是 - DefaultChannelGroup。但是,它內部使用ConcurrentMap<ChannelId, Channel>。因此,您可以按照與ConnectionCounter處理程序相同的方式來實現它。