本次将搭建一个最简单的Hello Netty服务器,并且通过这个简单的示例了解了Channel的生命周期。最后将基于Netty搭建一个Websocket网页聊天小程序,可以使用户在Web浏览器或者移动端浏览器进行消息的收发,来深入体会一下使用Netty编码NIO服务器是多么便捷。
Hello Netty服务器
- 构建一对主从线程组
- 定义服务器启动类
- 为服务器设置Channel
- 设置处理从线程池的助手类初始化器
- 监听启动和关闭服务器
1、构建主从线程组与服务启动类
首先新建一个Maven工程,引入Netty的依赖,我引入的依赖如下:
1 | <dependencies> |
2、设置Channel初始化器
每一个channel由多个handler共同组成管道(pipeline)
3、开始编写自定义的助手类
然后接下来启动服务器,通过Postman访问一下http://localhost:8080
得到如下结果:
如果直接在浏览器端访问的话会打印两次客户端远程地址,因为浏览器默认还访问了http://localhost:8080/favicon.ico
,或者使用在Linux环境下使用curl进行测试也是可以的。
探究Channel生命周期
我们通过重写下图所示的方法来研究一下Channel的生命周期(IDEA快捷键 Ctrl + O):
重写完成之后的CustomHandler如下:
1 | public class CustomHandler extends SimpleChannelInboundHandler<HttpObject> { |
通过Curl访问控制台打印如下:
为什么要用CURL而不是浏览器或者PostMan呢?因为我们使用了HTTP1.1的版本,支持长连接,而且默认是开启状态,所以看不到Channel不活跃断开的状态,所以才使用CURL来访问。
网页版的WebSocket聊天室
1、Netty 服务器编码
Netty 服务器启动类WSServe.java如下:
1 | import io.netty.bootstrap.ServerBootstrap; |
接下来是Channel初始化器WSServerInitializer.java
1 | import io.netty.channel.ChannelInitializer; |
最后是自定义的Handler,ChatHandler.java
1 | import io.netty.channel.Channel; |
2、前端JavaScript编码
下面是前端需要用到的WebSocket API:
1 | <html> |
3、效果展示
Netty编码的小总结
首先是流程,先新建主从线程组,编写启动类,因为Netty官方推荐的模式也是主从线程模型。接下来是编写Channel初始化器,继承自ChannelInitializer,Channel注册后会执行里面的相应的初始化方法,通过Channel获取管道,然后添加需要的Handler,最后添加自己的自定义的Handler来处理请求。
- 本文作者: Tim
- 本文链接: https://zouchanglin.cn/2020/07/03/1716304322.html
- 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 许可协议。转载请注明出处!