我正在学习 Netty,并开始使用 Spring Boot 一些教程。我的目标是创建一个应用程序,该应用程序设置一个 TCP 端口来接收消息并通过 REST API 呈现它们。
大多数教程都说我应该添加这样的东西
serverChannel = serverBootstrap.bind(tcpPort).sync().channel().closeFuture().sync().channel();
启动netty。
当我这样做时,我实现的其余服务不起作用。
现在,当我使用以下代码片段启动应用程序时:
serverChannel = serverBootstrap.bind(tcpPort).sync().channel();
一切似乎都运转良好。
有人可以向我解释一下可能导致此问题的原因吗?
Thanks
第一部分启动服务器,
1)将其绑定在TCP端口上,
2)等待服务器准备好(套接字正在侦听)
3) 并返回关联的通道。
serverBootstrap.bind(tcpPort).sync().channel();
(1) (2) (3)
第二部分是等待主通道(监听套接字)关闭(closeFuture().sync()
) where closeFuture
为您提供“关闭”操作的“未来”(意味着关闭服务器套接字),并且sync
等待这个未来的完成。channel()
为您返回与第一次相同的频道,只不过它现在已关闭。
因此,您可能会在各种示例中找到此代码,因为通常您在主线程左右启动服务器(绑定),然后如果您不等待某些内容,主线程将结束,让您的 JVM 完成,因此您的服务器启动后立即停止。
所以总的来说,我们要做的是:
- 启动服务器
- 在管道中添加必要的处理程序来处理您的业务逻辑(当然还有网络协议)
- 然后通过等待 closeFuture 来完成你的 main,这样,一旦在你的业务逻辑中你得到关闭的命令,你就关闭主通道,因此你的主线程也正在关闭。
参见例如以编程方式关闭 netty https://stackoverflow.com/questions/28032092/shutdown-netty-programmatically/28034689
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)