前言
-
WebSocket 是一种网络通信协议。RFC6455 定义了它的通信标准。
-
WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。
-
HTTP 协议是一种无状态的、无连接的、单向的应用层协议。它采用了请求/响应模型。通信请求只能由客户端发起,服务端对请求做出应答处理。
-
这种通信模型有一个弊端:HTTP 协议无法实现服务器主动向客户端发起消息。
-
这种单向请求的特点,注定了如果服务器有连续的状态变化,客户端要获知就非常麻烦。大多数 Web 应用程序将通过频繁的异步 AJAX 请求实现长轮询。轮询的效率低,非常浪费资源(因为必须不停连接,或者 HTTP 连接始终打开)。
http协议:
websocket协议:
- 弄清楚http协议与websocket协议的区别后,接下来我们就开始在springboot的项目中搭建websocket的环境
1.引入websocket的依赖
- 在pom.xml中引入websocket的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
2.注册配置类
- 创建WebSocketConfig配置类
@Configuration
public class WebSocketConfig {
@Bean
//注入ServerEndpointExporter bean对象,自动注册使用了@ServerEndpoint注解的bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
}
3.消息处理类
- 创建消息处理类,实现客户端与服务端的信息交互
@ServerEndpoint(value = "/chat/{token}")
@Component
public class WebSocketHandler {
//用来存储每一个客户端对象对应的ChatEndpoint对象
private static Map<String, WebSocketHandler> onlineUsers = new ConcurrentHashMap<>();
//用户的token
private String token;
@OnOpen
//连接建立时被调用
public void onOpen(Session session, EndpointConfig config, @PathParam("token") String token) {
this.token = token;
System.out.println("token:"+token);
System.out.println("连接成功~~~");
}
@OnMessage
//接收到客户端发送的数据时被调用
public void onMessage(String message, Session session) {
String id = session.getId();
System.out.println(id);
System.out.println("客户端发过来的消息:" + message);
System.out.println("将信息推送给服务端");
// 在这里根据接收到的消息进行处理
// 发送消息给客户端
sendMessageToClient(session, "我一直与你同在!!!!!哈哈哈哈哈哈哈哈哈哈");
}
@OnClose
//连接关闭时被调用
public void onClose(Session session) {
System.out.println("连接关闭");
}
// 发送消息给指定客户端
private void sendMessageToClient(Session session, String message) {
try {
session.getBasicRemote().sendText(message);
} catch (IOException e) {
e.printStackTrace();
}
}
}
4.前端测试js
- 简单的测试客户端与服务端js文件
var ws = new WebSocket('ws://127.0.0.1:9123/clientApi/watchOrder/token');//url:自己配置的url
// 获取连接状态
console.log('ws连接状态:' + ws.readyState);
//监听是否连接成功
ws.onopen = function () {
console.log('ws连接状态open:' + ws.readyState);
//连接成功则发送一个数据
ws.send('test1');
}
// 接听服务器发回的信息并处理展示
ws.onmessage = function (data) {
console.log('接收到来自服务器的消息:');
console.log(data);
//完成通信后关闭WebSocket连接
ws.close();
}
// 监听连接关闭事件
ws.onclose = function () {
// 监听整个过程中websocket的状态
console.log('ws连接状态close:' + ws.readyState);
}
// 监听并处理error事件
ws.onerror = function (error) {
console.log(error);
}
5.使用百度的控制台发js
- 没有专用工具的小伙伴可以用浏览器中的控制台进行测试,简单方便,嘎嘎好用
服务端显示:
至此,一个最简单的springboot整合websocket就搭建完成了