java - 单个 netty 服务器中的多个 Socket 服务器
问题描述
我正在尝试开发一个支持 TCP 套接字和 WebSockets 的套接字服务器。我使用它们的通道和处理程序创建了两个 ServerBootsrap。我用不同的端口启动它们(跳过不必要的代码部分,因为它们工作正常)
...
ChannelFuture channelFuture = serverBootstrap.bind(port);
...
...
ChannelFuture channelFutureWebsocket = serverBootstrapWebSocket.bind(webSocketPort);
在我看过的教程中,它们都以serverBootstrap.bind(port).sync();
但如果我以同步结束,则服务器停止并等待数据包,我无法启动另一台服务器(如预期的那样)。如果我不以同步结束,服务器运行正常,但我怀疑它是否会在未来导致错误。
如果我的方法 skippingsync()
是错误的,我如何同时运行 2 个不同的服务器?
解决方案
上面的 javadocFuture.sync
说:“等待这个未来,直到它完成,如果这个未来失败,则重新抛出失败的原因。”
所以你想要做的是获得两个期货并等待它们,而不是在你甚至有机会绑定第二个服务器之前等待第一个未来。
等待 2 个期货的一种简单方法是使用 while 循环并使用非阻塞方法检查两个期货
ChannelFuture bindFuture1 = bootstrap1.bind(port);
ChannelFuture bindFuture2 = bootstrap2.bind(port);
while (!bindFuture1.isDone() && !bindFuture2.isDone()) Thread.Sleep(INTERVAL);
//Evaluate both futures to see if there were any errors, wait for the other future to be done or do whatever else you need to based on your requirements.
我建议您阅读 futures 以了解该sync
方法的作用以及为什么它是必要的。也看看这里:等待未来的名单
推荐阅读
- symfony - Symfony 自引用实体方法不返回实体
- arrays - Ruby 三路传递比较
- java - 如何为 SharedPreference 创建单元测试用例?
- string - 字符串变量创建后如何替换其内容?
- aws-elasticsearch - AWS Elasticsearch - 在 Kibana 警报中访问 ctx
- javascript - 将显示对话框自定义 html 添加到 Google 幻灯片脚本
- angular - formControl的角度日期对话
- javascript - 有没有办法在 JavaScript 中重置全局变量
- python - 用于 json 值的 Prometheus python 导出器
- javascript - 我的授权语法有什么问题?获取 403 - ImgurAPI