1.什么是websocket?
WebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信——允许服务器主动发送信息给客户端。
2.为什么需要使用websocket?
之前游览器想获取服务器数据,只有不断发起请求,轮询获取。既效率低下,数据时效性也得不到保障。如果服务器能主动向客户端推送消息,这样就完美了。在这种想法下,websocket诞生了!
3.怎样使用websocket?
3.1.使用maven引入jar依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
3.2.编写配置类
首先创建服务器端点bean
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
再编写具体的端点请求处理类
package com.chenyuwen.demo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
@ServerEndpoint("/websocket")
@Component
public class WebSocket {
private static final Logger log = LoggerFactory.getLogger(WebSocket.class);
/**
* 连接建立成功调用的方法
* @param session
*/
@OnOpen
public void onOpen(Session session) {
log.info("创建连接");
}
/**
* 连接关闭调用的方法
*/
@OnClose
public void onClose() {
log.info("连接关闭");
}
/**
* 收到客户端消息后调用的方法
* @param session
* @param message 客户端发送过来的消息
*/
@OnMessage
public void onMessage(Session session, String message) {
log.info("收到消息:{}", message);
}
/**
* 发生错误时调用
*
* @param session
* @param error
*/
@OnError
public void onError(Session session, Throwable error) {
log.error("发生错误", error);
}
}
3.3.前端js编写
<!DOCTYPE HTML>
<html>
<head>
<title>My WebSocket</title>
</head>
<body>
Welcome<br/>
<input id="text" type="text"/>
<button onclick="send()">Send</button>
<button onclick="closeWebSocket()">Close</button>
<div id="message">
</div>
</body>
<script type="text/javascript">
var websocket = null;
//判断当前浏览器是否支持WebSocket
if ('WebSocket' in window) {
//使用http只需ws://,使用https则为wss://
websocket = new WebSocket("wss://localhost/websocket");
} else {
alert('Not support websocket')
}
//连接发生错误的回调方法
websocket.onerror = function () {
setMessageInnerHTML("error");
};
//连接成功建立的回调方法
websocket.onopen = function (event) {
setMessageInnerHTML("open");
}
//接收到消息的回调方法
websocket.onmessage = function (event) {
setMessageInnerHTML(event.data);
}
//连接关闭的回调方法
websocket.onclose = function () {
setMessageInnerHTML("close");
}
//监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
window.onbeforeunload = function () {
websocket.close();
}
//将消息显示在网页上
function setMessageInnerHTML(innerHTML) {
document.getElementById('message').innerHTML += innerHTML + '<br/>';
}
//关闭连接
function closeWebSocket() {
websocket.close();
}
//发送消息
function send() {
var message = document.getElementById('text').value;
websocket.send(message);
}
</script>
</html>
3.4.查看效果
当我们进入页面时,控制台会输出:
当我们输入“hello world!”并点击“Send”发送时:
控制台会输出:
当点击“Close”关闭连接时:
以上即实现了websocket在springboot中的简单使用。