私は、Nettyを使用してTCPサーバーを設計する予定です。クライアントが接続すると、私はただちに XMLデータをクライアントに数時間/日連続でポンピングする必要があります。それは簡単です。Nettyを使用してJavaで連続データを送信する最良の方法
だから、私は "channelConnected"メソッドをオーバーライドし、そのメソッドからデータを送信するのですか?... thats great。私は、次のChannelFactory
を使用することになります
ChannelFactory factory =
new NioServerSocketChannelFactory(
Executors.newCachedThreadPool(),
Executors.newCachedThreadPool());
NioServerSocketChannelFactory
ドキュメントは
ワーカースレッドが読んで、非ブロックモードでは1つまたは複数のチャネルのために書くの非ブロッキングを行うと言います。
良い。
有効なJavaの項目51:スレッドスケジューラに依存しないで、ワーカースレッドに「作業単位」を実行して終了/戻りたいとします。
私の場合、データを連続して送信する必要がありますが、チャンクを送信して(作業単位が完了した)、作業スレッドが戻ることができるようにします。それから私は別の1 MBを送るでしょう。
以下の例は、Netty HEREの公式ガイドからのものです。
私は無条件でクライアントに時間を送っていなければならない場合、このシナリオでは、 をそれぞれ作業単位として送信すると考えています。
これを行う方法の1つは、whileループを入れてThread.Sleepを行うことです。その他の方法で?
package org.jboss.netty.example.time;
public class TimeServerHandler extends SimpleChannelHandler {
@Override
public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) {
Channel ch = e.getChannel();
ChannelBuffer time = ChannelBuffers.buffer(4);
time.writeInt(System.currentTimeMillis()/1000);
ChannelFuture f = ch.write(time);
f.addListener(new ChannelFutureListener() {
public void operationComplete(ChannelFuture future) {
Channel ch = future.getChannel();
ch.close();
}
});
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) {
e.getCause().printStackTrace();
e.getChannel().close();
}
}