1. 引入pom
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
2.服务端代码
@ServerEndpoint(value = "/websocket/{group}/{param2}")
@Component
public class WebSocketTemplate {
private Logger logger = LoggerFactory.getLogger(this.getClass());
private static int onlineCount = 0;
private static final CopyOnWriteArraySet<WebSocketTemplate> webSocketSet = new CopyOnWriteArraySet<WebSocketTemplate>();
private static final Map<String, List<WebSocketTemplate>> webScoketMap = new HashMap<>();
private Session session;
public static Map<String,List<WebSocketTemplate>> getWebSocketSet(){
return webScoketMap;
}
@OnOpen
public void onOpen( @PathParam("group")String group,@PathParam("param2") String param2,Session session) {
logger.info("group:" + group);
logger.info("param2:" + param2);
this.session = session;
webSocketSet.add(this);
addOnlineCount();
System.out.println("有新连接加入!当前在线人数为" + getOnlineCount());
try {
sendMessage("连接成功");
} catch (IOException e) {
System.out.println("IO异常");
}
}
@OnClose
public void onClose() {
webSocketSet.remove(this);
if(WebSocketTemplate.onlineCount > 0){
subOnlineCount();
}
System.out.println("链接关闭,当前在线人数为" + getOnlineCount());
}
@OnMessage
public void onMessage(String message, Session session) {
System.out.println("来自客户端的消息:" + message);
for (WebSocketTemplate item : webSocketSet) {
try {
item.sendMessage(message);
} catch (IOException e) {
e.printStackTrace();
}
}
}
@OnError
public void onError(Session session, Throwable error) {
System.out.println("发生错误");
error.printStackTrace();
}
public void sendMessage(String message) throws IOException {
this.session.getBasicRemote().sendText(message);
}
public static void sendAllMessage(String message) throws IOException {
for (WebSocketTemplate item : webSocketSet) {
try {
item.sendMessage(message);
} catch (IOException e) {
continue;
}
}
}
public static synchronized int getOnlineCount() {
return onlineCount;
}
public static synchronized void addOnlineCount() {
WebSocketTemplate.onlineCount++;
}
public static synchronized void subOnlineCount() {
WebSocketTemplate.onlineCount--;
}
}
@Configuration
public class WebSocketConfig {
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
@Bean
@Nullable
public TaskScheduler taskScheduler() {
ThreadPoolTaskScheduler threadPoolScheduler = new ThreadPoolTaskScheduler();
threadPoolScheduler.setThreadNamePrefix("SockJS-");
threadPoolScheduler.setPoolSize(Runtime.getRuntime().availableProcessors());
threadPoolScheduler.setRemoveOnCancelPolicy(true);
return threadPoolScheduler;
}
}
@Controller
@RequestMapping("webScoket")
public class WebScoketController {
@RequestMapping("gotoWbscoketTest")
public String gotoWbscoketTest(){
return "wbscoketTest";
}
@RequestMapping("size")
@ResponseBody
public ResultModel getSize(){
int onlineCount = WebSocketTemplate.getOnlineCount();
return new ResultModel(ErrorMsg.SELECT_SUCCESS,onlineCount);
}
@RequestMapping("send")
@ResponseBody
public String sendMag(String msg){
try {
WebSocketTemplate.sendAllMessage(msg);
} catch (IOException e) {
e.printStackTrace();
}
return "success";
}
}
3.页面代码
<!DOCTYPE HTML>
<html>
<head>
<title>WebSocket测试</title>
</head>
<body>
<h1>WebSocket测试</h1>
<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;
if('WebSocket' in window){
websocket = new WebSocket("ws://localhost:8090/websocket/param1/param2");
}
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");
}
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>