我打算用Netty来设计一个TCP Server。当客户端连接时,我必须立即开始连续向客户端发送 XML 数据……数小时/数天。就这么简单。
所以,我重写了“channelConnected”方法并从该方法发送数据,对吧?......那太好了。
我将使用以下 ChannelFactory
ChannelFactory factory =
new NioServerSocketChannelFactory(
Executors.newCachedThreadPool(),
Executors.newCachedThreadPool());
NioServerSocketChannelFactory
文件说
工作线程以非阻塞模式对一个或多个 Channel 执行非阻塞读写。
好的。
根据有效的 Java 第 51 条:不要依赖线程调度程序,我希望工作线程执行“工作单元”,然后完成/返回。
所以在我的情况下,虽然我必须连续发送数据,但我想发送一些块(比如说 1 MB)然后完成(工作单元完成),以便工作线程可以返回。然后我会再发送 1 MB。
下面的例子来自 Netty HERE的官方指南。
我想问题是,在这种情况下,如果我必须无条件地继续向客户发送时间,我将如何做,将每次发送视为一个工作单元。
一种方法是只放置一个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();
}
}