Netty 4.0.23複数のホストシングルクライアント -- java フィールド と multithreading フィールド と sockets フィールド と connection フィールド と netty フィールド 関連 問題

Netty 4.0.23 multiple hosts single client












2
vote

問題

日本語

私の質問Netty 4.0.23の最終的な同じイベントループグループを使用して複数のホストへの複数のTCPクライアントを作成することです。特にNetty 4のクライアントスレッディングビジネス、特に混乱した参照の負荷を考慮して、 Netty 3.xxの実装に私はインターネット上の私の研究を通して打ちました。

次のコードでは、1つのサーバーとの接続を確立し、コマンドキューを使用してRANDOMコマンドを送信します。

<事前> <コード> public class TCPsocket { private static final CircularFifoQueue CommandQueue = new CircularFifoQueue(20); private final EventLoopGroup workerGroup; private final TcpClientInitializer tcpHandlerInit; // all handlers shearable public TCPsocket() { workerGroup = new NioEventLoopGroup(); tcpHandlerInit = new TcpClientInitializer(); } public void connect(String host, int port) throws InterruptedException { try { Bootstrap b = new Bootstrap(); b.group(workerGroup); b.channel(NioSocketChannel.class); b.remoteAddress(host, port); b.handler(tcpHandlerInit); Channel ch = b.connect().sync().channel(); ChannelFuture writeCommand = null; for (;;) { if (!CommandQueue.isEmpty()) { writeCommand = ch.writeAndFlush(CommandExecute()); // commandExecute() fetches a command form the commandQueue and encodes it into a byte array } if (CommandQueue.isFull()) { // this will never happen ... or should never happen ch.closeFuture().sync(); break; } } if (writeCommand != null) { writeCommand.sync(); } } finally { workerGroup.shutdownGracefully(); } } public static void main(String args[]) throws InterruptedException { TCPsocket socket = new TCPsocket(); socket.connect("192.168.0.1", 2101); } }

コマンドキューからコマンドをオフにすることに加えて、このクライアントは、チャネルがアクティブになると登録されたハンドラの1つ(TCPClientInitializer)で送信される初期コマンドに対する応答としての定期応答を受信し続けます。実装)、私は持っています:

<事前> <コード> @Override public void channelActive(ChannelHandlerContext ctx) { ctx.writeAndFlush(firstMessage); System.out.println("sent first message "); }

接続しているサーバの機能を有効にし、サーバから返される周期的なパケットをトリガします。

この同じ設定を使用して複数のサーバーに接続しようとすると問題があります。 既知のサーバーIPの文字列配列をループすることによって:

<事前> <コード> public static void main(String args[]) throws InterruptedException { String[] hosts = new String[]{"192.168.0.2", "192.168.0.4", "192.168.0.5"}; TCPsocket socket = new TCPsocket(); for (String host : hosts) { socket.connect(host, 2101); } }

最初の接続が確立され、サーバー(192.168.0.2)が指定された定期パケットの送信を開始しますが、他の接続が試みられていません。したがって、forループの2番目の反復を実行することはありません。この質問接続プロセスが別のスレッドで開始され、メインスレッドが実行を続けることを可能にするが、それは私がここに表示されるものではないので、実際に起こっているのは何ですか。そして、Netty 4.0.23最後のクライアントを使用して複数のホスト接続を実装する方法はどうなりますか?

事前感あり

英語

My question is about creating multiple TCP clients to multiple hosts using the same event loop group in Netty 4.0.23 Final, I must admit that I don't quite understand Netty 4's client threading business, especially with the loads of confusing references to Netty 3.X.X implementations I hit through my research on the internet.

with the following code, I establish a connection with a single server, and send random commands using a command queue:

public class TCPsocket { private static final CircularFifoQueue CommandQueue = new CircularFifoQueue(20); private final EventLoopGroup workerGroup; private final TcpClientInitializer tcpHandlerInit;  // all handlers shearable  public TCPsocket() {         workerGroup = new NioEventLoopGroup();         tcpHandlerInit = new TcpClientInitializer();  } public void connect(String host, int port) throws InterruptedException {     try {         Bootstrap b = new Bootstrap();         b.group(workerGroup);         b.channel(NioSocketChannel.class);         b.remoteAddress(host, port);         b.handler(tcpHandlerInit);         Channel ch = b.connect().sync().channel();         ChannelFuture writeCommand = null;         for (;;) {             if (!CommandQueue.isEmpty()) {                 writeCommand = ch.writeAndFlush(CommandExecute()); // commandExecute() fetches a command form the commandQueue and encodes it into a byte array             }             if (CommandQueue.isFull()) { // this will never happen ... or should never happen                 ch.closeFuture().sync();                 break;             }         }         if (writeCommand != null) {             writeCommand.sync();         }     } finally {         workerGroup.shutdownGracefully();     } }      public static void main(String args[]) throws InterruptedException {         TCPsocket socket = new TCPsocket();             socket.connect("192.168.0.1", 2101);      } } 

in addition to executing commands off of the command queue, this client keeps receiving periodic responses from the serve as a response to an initial command that is sent as soon as the channel becomes active, in one of the registered handlers (in TCPClientInitializer implementation), I have:

@Override public void channelActive(ChannelHandlerContext ctx) {     ctx.writeAndFlush(firstMessage);     System.out.println("sent first message "); } 

which activates a feature in the connected-to server, triggering a periodic packet that is returned from the server through the life span of my application.

The problem comes when I try to use this same setup to connect to multiple servers, by looping through a string array of known server IPs:

public static void main(String args[]) throws InterruptedException {     String[] hosts = new String[]{"192.168.0.2", "192.168.0.4", "192.168.0.5"};     TCPsocket socket = new TCPsocket();     for (String host : hosts) {         socket.connect(host, 2101);     } } 

once the first connection is established, and the server (192.168.0.2) starts sending the designated periodic packets, no other connection is attempted, which (I think) is the result of the main thread waiting on the connection to die, hence never running the second iteration of the for loop, the discussion in this question leads me to think that the connection process is started in a separate thread, allowing the main thread to continue executing, but that's not what I see here, So what is actually happening? And how would I go about implementing multiple hosts connections using the same client in Netty 4.0.23 Final?

Thanks in advance

</div
              
       
       

回答リスト


関連する質問

1  サーバーハンドラによるNetty非同期応答  ( Netty asynchronous responses by server handler ) 
サーバハンドラ。受信したメッセージごとに、複数の応答があります。ビジネスロジックには、リクエストをキューに入れ、キューから削除し、要求を処理し、応答します。 要求を非同期的に処理する方法は、キューの整合性を維持しながら非同期に応答しますか? 以下のコードは同期...

0  あるチャネルから別のチャンネルへのデコードされたメッセージを書き込む原因:IllegalBufferAccessException例外  ( Write decoded message from one channel to another channel cause illegalbufferacc ) 
私はNettyに新しいです。復号化されたHTTPメッセージをサーバーチャネルからバックエンドクライアントチャンネルに書き込むためのHTTPコーデックハンドラを追加し、クライアントがメッセージをデコードし、応答メッセージをInboundChannelに書き戻すこ...

0  EPOLLでは、Netty UDPマルチキャストはサポートされていません。どうして?  ( Netty udp multicast not supported with epoll why ) 
クラスの epolldatagramchannelconfig 4次の方法: <事前> <コード> @Override public EpollDatagramChannelConfig setTimeToLive(int ttl) { throw ...

0  WSSを使ったドラフト10  ( Draft10 with wss ) 
Netty Praft10をSSL(WSS)の上に実行しようとしています(WSS) https://github.com/netty/netty/tree/master/src/main/java/org/jboss/netty/example/http...

0  MultithReadEventExecutorGroup Netty 4でEventExeCutorChooserを置換できないのはなぜですか  ( Why cant i replace eventexecutorchooser in multithreadeventexecutorgroup netty ) 
私はなぜ<コード> EventExecutorChooser が MultithreadEventExecutorGroup のプライベートメンバーであり、置き換えることはできませんか? Nettyはこの方向に行ったようです...デフォルトのRRスレッドセレク...

0  あなたはNettyにGnu Troveを使っていましたか?  ( Have you thought use gnu trove in netty ) 
私はいくつかの例を試した後、私は本当にこのプロジェクトが好きです。私はあなたがこれについて素晴らしい仕事をしていると思います。 Gnu Troveを使うことを考えているのであれば、ただ興味がありますか?あなたはどう思いますか? ...

4  Netty Socketio SSL  ( Netty socketio ssl ) 
私はNetty Socketio demo からSSLChatlauncherを取得できます。 私はすでに私のサーバーにこれをしました <事前> <コード> config.setHostname("localhost"); config.se...

0  Netty - Channel Writeはデータをクライアントに送信できません  ( Netty channel write fail to send the data to the client ) 
Netty 3.6.xを使用してソケットベースのアプリを開発しています。しかし、私はchannel.writeの問題に遭遇しています。これが私がしたことです。 最初に、チャネルが接続状態になるたびにチャネルに書き込まれ、成功します。サーバーが完了したら、それ...

4  Vertx Blocking DNSの問題を解決する方法  ( How to solve vertx blocking dns issue ) 
tl; DR:Vertxに関するDNS問題のブロックを克服することは可能ですか?好ましくは、Vertx HttpClient? vertxを使って、さまざまなホストを持つURLを削除しようとしています。私は現在Vertx HttpClientを使用するよう...

0  GetNames()のようなNetty ChannelPipelineメソッドは、「適切な」順序で結果を与えることが保証されていますか?  ( Are the netty channelpipeline methods like getnames guaranteed to give results ) 
2つのNetty Pipelinesを1つに連結する方法を把握しようとしています。それは十分に簡単であるべきであるようです。 のようなもの <事前> <コード> List<String> namesOfSecond = second.getNames(); ...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有