私はネットのサンプルコードを使用していました-telnetパケット。コードはサーバーとクライアントを確立してtelnetを使用してチャットできますが、クライアントはサーバーとしか通信できません。クライアントがすべてのクライアントと通信できるように書き直しているので、チャネル リストを保持する必要があります。これにより、クライアントがサーバーに接続したときに、サーバーがメッセージをすべてのクライアントに送信できるようになります。すべてのクライアント チャネルを取得する方法を誰か教えてもらえますか? (コード例は、ここにリンクの説明を入力してください)
4 に答える
Netty 4.0.X の場合
メイン クラスでは、ChannelGroup オブジェクトを宣言する必要があります。
final ChannelGroup channels =
new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
新しいクライアントが接続されたとき (コンストラクターのチャンネル オブジェクトをハンドラー クラスに渡す必要があります):
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
channels.add(ctx.channel());
}
すべてのクライアントを取得するには、channels オブジェクトを繰り返します。
for (Channel ch : channels) {
//do something with ch object
}
それが役に立てば幸い。
マウリシオの提案は良いものです。さらに、Netty API はすでにChannelGroupにチャネル コンテナーを提供しています。これはスレッドセーフであり、含まれているすべてのチャネルでのグループ操作や、含まれているチャネルが閉じられたときの自動削除など、いくつかの追加機能も提供します。javadoc から:
開いているチャネルを含み、それらに対してさまざまな一括操作を提供するスレッドセーフなセット。ChannelGroup を使用すると、チャネルを意味のあるグループ (サービスごとまたは状態ごとなど) に分類できます。クローズされたチャネルはコレクションから自動的に削除されるため、チャネルのライフサイクルについて心配する必要はありません。チャンネルを追加しました。Channel は、複数の ChannelGroup に属することができます。
ここに小さな例があります(SimpleChannelUpstreamHandlerのchannelConnectedをオーバーライドします):
ChannelGroup allConnected = new DefaultChannelGroup("all-connected");
@Override
public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
super.channelConnected(ctx, e);
allConnected.add(e.getChannel());
}
これで、次のように接続されているすべてのチャネルにメッセージを送信できます。
ChannelBuffer cb = ChannelBuffers.wrappedBuffer("hello".getBytes(Charset.forName("UTF-8")));
allConnected.write(cb);
channelConnectedイベントで、 ChannelHandlerContextからクライアントを取得し、それをどこかに格納します( ConcurrentHashMapのように、同時コレクションが便利です)。また、切断されたチャネルをコレクションから削除するには、 channelClosedメソッドを実装する必要があります。