注意事项:security,拦截器、注册hander等可能导致webSocket访问不到
参考链接:https://blog.csdn.net/slt6366078/article/details/80360941
原文:https://blog.csdn.net/moshowgame/article/details/80275084;https://blog.csdn.net/a78270528/article/details/78180449
1. 引入 jar
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
2. WebSocket服务端 注意加入@Component
package com.example.localhost.service;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.concurrent.CopyOnWriteArraySet;
/**
* Created by 41997 on 2019/6/17.
*/
@Component
@ServerEndpoint("/web/webSocket")
public class WebSocketService {
private static CopyOnWriteArraySet<Session> sessions = new CopyOnWriteArraySet<>();
private Logger log = LoggerFactory.getLogger(WebSocketService.class);
@OnOpen
public void onOpen(Session session){
log.info(session.getId()+"客户端连接");
sessions.add(session);
}
@OnMessage
public void onMessage(String message,Session session){
log.info("接收到"+session.getId()+"的消息:"+message);
sendAll(message,session);
}
/**
* 给所有人发送消息
* @param message 消息
* @param session 发送方
*/
public void sendAll(String message,Session session){
for(Session session1:sessions){
log.info("接收到"+session.getId()+"的消息,发送给"+session1.getId()+":"+message);
send(message,session1);
}
}
/**
* 发送消息
* @param message 消息内容
* @param session 接收方
*/
public void send(String message,Session session){
try {
session.getBasicRemote().sendText(message);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 发生错误时调用
* @param session 发生错误的客户端
* @param error 错误信息
*/
@OnError
public void onError(Session session, Throwable error){
//移除发生的客户端session
//sessions.remove(session);
log.info("客户端"+session.getId()+",发生异常");
error.printStackTrace();
}
@OnClose
public void onClose(Session session){
log.info("客户端"+session.getId()+"关闭连接");
//移除关闭的客户端session
sessions.remove(session);
}
}
3.springboot 启用WebSocket的支持
package com.example.localhost.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
/**
* Created by 41997 on 2019/6/20.
*/
@Configuration
public class WebSocketConfig {
//方法名称写错了会报错,未解决
@Bean
public ServerEndpointExporter serverEndpointExporter(){
return new ServerEndpointExporter();
}
}
4. WebSocket客户端
/**
* Created by 41997 on 2019/6/17.
*/
var webSocket = null;
$(document).ready();
$(function(){
webSocketClient();
});
function webSocketClient(){
if('WebSocket' in window){
alert("你的浏览器支持WebSocket消息推送!");
webSocket = new WebSocket("ws://127.0.0.1:80/web/webSocket");//new WebSocket(url, [protocol] );第一个参数 url, 指定连接的 URL。第二个参数 protocol 是可选的,指定了可接受的子协议
//连接建立时触发
webSocket.onopen = function(event){
webSocketState();
console.info(JSON.stringify(event));
}
//客户端接收服务端数据时触发
webSocket.onmessage = function (event) {
webSocketState();
console.info(JSON.stringify(event));
$("#messageBox").append(event.data+"<br/>");
}
//通信发生错误时触发
webSocket.onerror = function (event) {
webSocketState();
console.info(JSON.stringify(event));
}
//连接关闭时触发
webSocket.onclose = function (event) {
webSocketState();
console.info(JSON.stringify(event));
}
}else{
alert("你的浏览器不支持WebSocket消息推送!");
}
}
/**
* WebSocket状态
* 0 - 表示连接尚未建立。
* 1 - 表示连接已建立,可以进行通信。
* 2 - 表示连接正在进行关闭。
* 3 - 表示连接已经关闭或者连接不能打开。
*/
function webSocketState(){
if(webSocket != null){
switch (webSocket.readyState){
case 0:
console.info("连接尚未建立");
break;
case 1:
console.info("连接已建立,可以进行通信");
break;
case 2:
console.info("连接正在进行关闭");
break;
case 3:
console.info("连接已经关闭或者连接不能打开");
break;
}
}
}
function onSend(){
var message = $("#message").val();
sendMessage(message)
}
/**
* 发送消息
* @param message 消息内容
*/
function sendMessage(message){
if(webSocket != null){
webSocket.send(message);
}
}
function closeWebSocket(){
if(webSocket != null){
webSocket.close();
}
}
<body>
<dvi>
<input type="text" id="message"/><button type="button" onclick="onSend()">发送</button>
<br/>
<button type="button" onclick="closeWebSocket()">关闭连接</button>
<div id="messageBox"></div>
</dvi>
</body>