【问题标题】:Best way to send continuous data in Java using Netty使用 Netty 在 Java 中发送连续数据的最佳方式
【发布时间】:2011-10-10 12:24:47
【问题描述】:

我打算用 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();
        }
    }

【问题讨论】:

    标签: java multithreading network-programming threadpool netty


    【解决方案1】:

    做一会儿/睡眠会起作用,但不会采用 Netty 的超级可扩展风格。这将是每个连接的线程编程。

    相反,在 Executor 上安排一个定期作业,将消息写入通道。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-31
      • 1970-01-01
      相关资源
      最近更新 更多