Websocket定义
代码实现
引入maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
配置类
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
@Configuration
public class WebSocketConfig {
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
}
WebSocketServer 服务端
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.corundumstudio.socketio.annotation.OnDisconnect;
import com.hc.dialer_server.service.SendMessageService;
import com.hc.dialer_server.utils.SpringContextUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.context.annotation.DependsOn;
import org.springframework.stereotype.Component;
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;
@Component
@Slf4j
@ServerEndpoint("/websocket/{number}")
@DependsOn("springContext")
public class WebSocketServer {
SendMessageService sendMessageServiceImpl = SpringContextUtils.getBean("sendMessageServiceImpl");
private static AtomicInteger onlineSessionClientCount = new AtomicInteger(0);
public static Map<String, Session> connectionMap = new ConcurrentHashMap<>();
private String number;
@OnOpen
public void onOpen(@PathParam("number") String number, Session session) throws IOException {
log.info("连接建立中 ==> session_id = {}, number = {}", session.getId(), number);
onlineSessionClientCount.incrementAndGet();
this.number = number;
connectionMap.put(number, session);
session.getBasicRemote().sendText("连接建立成功");
log.info("连接建立成功, 当前在线数为: {}, session_id = {}, number = {}", onlineSessionClientCount, session.getId(), number);
}
@OnClose
public void onClose(@PathParam("number") String number, Session session) {
connectionMap.remove(number);
onlineSessionClientCount.decrementAndGet();
log.info("连接关闭成功, 当前在线数为: {} ==> 关闭该连接信息: session_id = {}, number = {}", onlineSessionClientCount, session.getId(), number);
}
@OnMessage
public void onMessage(String message, Session session) throws Exception {
if (StringUtils.isBlank(message)) {
return;
}
JSONObject jsonObject = JSON.parseObject(message);
String eventType = jsonObject.getString("eventType");
String msg = jsonObject.getString("message");
log.info("服务端收到客户端消息 ==> number = {}, eventType = {}, message = {}", number, eventType, msg);
session.getBasicRemote().sendText("服务端给客户端发送消息");
}
@OnDisconnect
public void onDisconnect(Session session) {
connectionMap.remove(number);
onlineSessionClientCount.decrementAndGet();
log.info("disconnect event ==> number: {}, session_id: {}, 当前在线数: {}", number, session.getId(), onlineSessionClientCount);
}
@OnError
public void onError(Session session, Throwable error) {
log.error("WebSocket发生错误, session id = {}, 错误信息为:{}", session.getId(), error.getMessage());
}
}
工具类
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
@Component("springContext")
public class SpringContextUtils implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@SuppressWarnings("unchecked")
public static <T> T getBean(String name) {
return (T) applicationContext.getBean(name);
}
public static <T> T getBean(Class<T> clz) {
return applicationContext.getBean(clz);
}
public static boolean containsBean(String name) {
return applicationContext.containsBean(name);
}
public static boolean isSingleton(String name) {
return applicationContext.isSingleton(name);
}
public static Class<?> getType(String name) {
return applicationContext.getType(name);
}
@Override
public synchronized void setApplicationContext(ApplicationContext applicationContext) {
if (SpringContextUtils.applicationContext == null) {
SpringContextUtils.applicationContext = applicationContext;
}
}
}
前端
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>测试webSocket</title>
</head>
<body>
Client传来的number:
<!--<input type="text" th:value="${number}" id="number"/>-->
<p>【eventType】:
<div><input id="toUserId" name="toUserId" type="text" value="message"></div>
<p>【messageText】:
<div><input id="contentText" name="contentText" type="text" value="hello websocket"></div>
<p>【操作】:
<div>
<button type="button" onclick="sendMessage()">发送消息</button>
<button type="button" onclick="sendMessage1()">1626</button>
</div>
</body>
<script type="text/javascript">
var socket;
if (typeof (WebSocket) == "undefined") {
console.log("您的浏览器不支持WebSocket");
} else {
console.log("您的浏览器支持WebSocket");
var number = '1626';
console.log("number-->" + number);
var reqUrl = "http://localhost:8080/websocket/" + number;
socket = new WebSocket(reqUrl.replace("http", "ws"));
socket.onopen = function () {
console.log("Socket 已打开");
};
socket.onmessage = function (msg) {
console.log("onmessage--" + msg.data);
};
socket.onclose = function () {
console.log("Socket已关闭");
};
socket.onerror = function () {
alert("Socket发生了错误");
}
}
function sendMessage() {
if (typeof (WebSocket) == "undefined") {
console.log("您的浏览器不支持WebSocket");
} else {
var toUserId = document.getElementById('toUserId').value;
var contentText = document.getElementById('contentText').value;
var msg = '{"eventType":"' + toUserId + '","message":"' + contentText + '"}';
console.log(msg);
socket.send(msg);
}
}
function sendMessage1() {
if (typeof (WebSocket) == "undefined") {
console.log("您的浏览器不支持WebSocket");
} else {
var toUserId = document.getElementById('toUserId').value;
var contentText = document.getElementById('contentText').value;
var msg = '{"eventType":"' + toUserId + '","message":{"number":"1626","serviceNumber":"60600","req":"event01"}}';
console.log(msg);
socket.send(msg);
}
}
</script>
</html>
测试
![在这里插入图片描述](https://img-blog.csdnimg.cn/9cf14299853744c7a5a982e5f58454b4.png)