我正在使用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个客户端连接。这不起作用。第一个客户端连接按预期工作,但第二个连接最终会引发连接超时异常。
问题:
现在我的代码仍然只使用一个端口进行连接。我是否需要为每个可能的连接提供唯一的端口?我还没有看到这样的例子。我是否需要为可能的多个连接调整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;
}
任何帮助都将深表感谢。 感谢
答案 0 :(得分:0)
您说得对,工作池与并发连接数相关联。你作为工人传递了什么样的遗嘱执行人?我建议使用Executors.newCachedThreadPool()
。在这种情况下,建议不要在你的NioServerSocketChannelFactory中设置任何第三个值,因为它默认使用NumberOfCore * 2,所以就像你之前一样。
此外,我认为你的ServerMessageHandler永远不会阻塞(或者很长时间),因为如果确实如此,那么你必须在管道之前添加像OrderedMemoryAwareThreadPoolExecutor
这样的东西来释放工作线程。