クライアントがnettyで作成したソケット接続を再利用するために何を行う必要があるのか誰かが指摘できますか? Nettyのクライアント側にチャネルを作成すると、複数の同時スレッドが同期なしで同じチャネルを使用できますか? netty 3.2でこのシナリオを処理する正しい方法は何ですか?クライアント永続ソケット
-TK
クライアントがnettyで作成したソケット接続を再利用するために何を行う必要があるのか誰かが指摘できますか? Nettyのクライアント側にチャネルを作成すると、複数の同時スレッドが同期なしで同じチャネルを使用できますか? netty 3.2でこのシナリオを処理する正しい方法は何ですか?クライアント永続ソケット
-TK
すべてのメソッドは、スレッドセーフであるとはい同じチャネルが異なるスレッドで使用することができます。
異なるスレッドからchannel.write()を呼び出す際に問題はありません。 読み取りは、マルチスレッドの問題がないように、カスタムハンドラのイベントを処理することによって行われます。 messageReceivedイベントが発生したときに何をすべきかを決めるのはあなたのビジネスです。
ClientBootstrap bootstrap = new ClientBootstrap(factory);
bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
public ChannelPipeline getPipeline() throws Exception {
ChannelPipeline pipeline = Channels.pipeline();
pipeline.addLast("LOGGER", new LoggingHandler("CLIENT", true));
return pipeline;
}
});
// Connect to the server, wait for the connection and get back the channel
ChannelFuture connectFuture = bootstrap.connect(new InetSocketAddress(host, port));
// Wait until the connection attempt succeeds or fails.
Channel channel = connectFuture.awaitUninterruptibly().getChannel();
もう一つの方法は、このようなハンドラを実装し、工場でパイプラインにハンドラを追加することができます
チャンネルを取得するための基本的な方法はClientBootStrapを使用し、それを行うことです。その後、いつでもチャンネルにアクセスすることができますが、最初の解決策はそのトリックを行う最善の方法のようです!
public class PublicChannelHandler extends SimpleChannelUpstreamHandler {
Channel channel;
public Channel getChannel(){
if (channel == null) {
throw new IllegalStateException("No underlying Channel is associated with this handler at the moment.");
}
return this.channel;
}
@Override
public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
this.channel=ctx.getChannel());
}
}