2017-10-20 49 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--; 
    } 
} 

EDIT

あなたはそれ以外の場合は、いくつかの問題(競合状態)を引き起こす可能性のあるスレッドを使用する必要が念頭に置いておく必要があります。複数のスレッドを使用する必要がある場合は、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ハンドラと同じ方法で実装できます。

関連する問題