多个Netty客户端将数据发送到一个Netty服务器

时间:2014-12-11 19:44:18

标签: multithreading netty

我正在使用Netty 3.9.5,我有一个简单的客户端服务器设置,我从http://en.wikipedia.org/wiki/Netty_%28software%29#Netty_TCP_Example获得。我已经扩展了示例,将Java搜索计划对象从客户端发送到服务器。在本网站上关注用户的帮助下,我已经能够使该程序按照需要运行。

我现在想让我的读者/服务器程序同时接受多个客户端。我以为我会采用下面列出的原始管道工厂代码:

channelFactory = new NioServerSocketChannelFactory(bossThreadPool,
            workerThreadPool);
    this.bootstrap = new ServerBootstrap(channelFactory);
    this.bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
        @Override
        public ChannelPipeline getPipeline() throws Exception {
            return Channels.pipeline(
                    new ObjectEncoder(),
                    new ObjectDecoder(ClassResolvers
                            .cacheDisabled(getClass().getClassLoader())),
                    new ServerMessageHandler());
        }
    });

并进行此更改:

channelFactory = new NioServerSocketChannelFactory(bossThreadPool,workerThreadPool, 3);

我认为这会在workerThreadPool中创建3个工作线程,而这反过来又可以处理3个客户端连接。这不起作用。第一个客户端连接按预期工作,但第二个连接最终会引发连接超时异常。

问题:

  1. 我对workerThreadPool的假设是否正确,如果是,我忘记了什么?
  2. 现在我的代码仍然只使用一个端口进行连接。我是否需要为每个可能的连接提供唯一的端口?我还没有看到这样的例子。我是否需要为可能的多个连接调整bind方法或acceptor.isBound方法?

    public boolean connect() {
    boolean status = false; // assume failure
    
    final int LISTEN_PORT = 53233;
    
    /*
     * We use a channel when attempting to bind the ServerBootstrap to
     * ensure if the operation was successful
     */
    acceptor = this.bootstrap.bind(new InetSocketAddress(LISTEN_PORT));
    
    /*
     * We make sure the Server could bind to the port by calling the
     * isBound() method in the Channel class.
     */
    if (!acceptor.isBound()) {
        logger.error(ErrorMessage.SERVER_UNABLE_TO_BIND + LISTEN_PORT);
    
        status = false;
    } else {
        status = true;
        logger.info(Message.SERVER_CONNECTION_SUCCESSFUL + LISTEN_PORT
                + "!" + Message.SERVER_AWAITING_CONNECTIONS);
    }
    
    return status;
    }
    
  3. 任何帮助都将深表感谢。 感谢

1 个答案:

答案 0 :(得分:0)

您说得对,工作池与并发连接数相关联。你作为工人传递了什么样的遗嘱执行人?我建议使用Executors.newCachedThreadPool()。在这种情况下,建议不要在你的NioServerSocketChannelFactory中设置任何第三个值,因为它默认使用NumberOfCore * 2,所以就像你之前一样。

此外,我认为你的ServerMessageHandler永远不会阻塞(或者很长时间),因为如果确实如此,那么你必须在管道之前添加像OrderedMemoryAwareThreadPoolExecutor这样的东西来释放工作线程。