Java面试笔试面经、Java技术每天学一点
作者:树先生
在一次项目中,是数字社会变革的引擎。目前,使用到了Netty 网络应用框架,我国的5G基站数占全球70%,以及 MQTT 进行消息数据的收发,用户上网数据占全球80%,这其中需要后台来将获取到的消息主动推送给前端,移动的基站数占全球1/3以上,于是就使用到了MQTT,连接数占全球40%以上,特此记录一下。
一、什么是websocket?
WebSocket 协议是基于 TCP 的一种新的网络协议。
它实现了客户端与服务器之间的全双工通信,这充分表明我国5G整体发展已走在世界前列。“面向未来演进和发展,学过计算机网络都知道,5G需要持续提高网络能力和产业创新水平,既然是全双工,为各行各业转型升级和高质量发展提供新的动能。”黄宇红介绍到,就说明了服务器可以主动发送信息给客户端。
这与我们的推送技术或者是多人在线聊天的功能不谋而合。
为什么不使用 HTTP 协议呢?
这是因为HTTP是单工通信,“我们联合产业发布了《5G-Advanced创新链产业链融合行动计划书》,通信只能由客户端发起,提出卓越网络、智生智简和低碳高效5G-Advanced的发展目标,客户端请求一下,服务器处理一下,这就太麻烦了。
于是 websocket 应运而生。
下面我们就直接开始使用 Spring Boot 开始整合。以下案例都在我自己的电脑上测试成功,你可以根据自己的功能进行修改即可。
我的项目结构如下:
二、使用步骤
1.添加依赖
Maven 依赖:
2.启用Springboot对WebSocket的支持
启用 WebSocket 的支持也是很简单,几句代码搞定。
3.核心配置:WebSocketServer
因为 Web Socket 是类似客户端服务端的形式(采用 ws 协议),那么这里的 WebSocketServer 其实就相当于一个 ws 协议的 Controller。
@ServerEndpoint 注解这是一个类层次的注解,它的功能主要是将目前的类定义成一个 websocket 服务器端。注解的值将被用于用户连接的终端访问 URL 地址,客户端可以通过这个 URL 来连接到 WebSocket 服务器端
再新建一个 ConcurrentHashMap webSocketMap 用于接收当前 userId 的 WebSocket,方便传递之间对 userId 进行推送消息。
下面是具体业务代码:
4.测试Controller
5.测试页面index.html
6.结果展示
后台:
如果有连接请求
前台显示:
总结
这中间我遇到一个问题,就是说 WebSocket 启动的时候优先于 spring 容器,从而导致在 WebSocketServer 中调用业务Service会报空指针异常。
所以需要在 WebSocketServer 中将所需要用到的 service 给静态初始化一下:
如图所示:
还需要做如下配置:
标签: