1、先添加pom依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
2、在springboot启动类中添加@EnableWebSocket注解和下面初始化bean代码
/**
* 初始化Bean,它会自动注册使用了 @ServerEndpoint 注解声明的 WebSocket endpoint
* @return
*/
@Bean
public ServerEndpointExporter serverEndpointExporter(){
return new ServerEndpointExporter();
}
3、新建一个Controller
package cn.com.maxtech.websocket.web;
import org.springframework.web.bind.annotation.RestController;
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@RestController
@ServerEndpoint("/online/{username}")
public class WebSocketController {
/**
* 模拟存储 在线用户
*/
public static Map<String, Session> USERS_ONLINE = new ConcurrentHashMap<>();
@OnOpen
public void openSession(@PathParam("username") String username, Session session) throws IOException {
//存储用户
USERS_ONLINE.put(username, session);
//向所有在线用户发送用户上线通知消息
Iterator<Session> sessionIteratorr = USERS_ONLINE.values().iterator();
while (sessionIteratorr.hasNext()){
sessionIteratorr.next().getAsyncRemote().sendText( "["+username+"]进入聊天室,当前在线数量:"+USERS_ONLINE.size());//异步发送
}
}
@OnClose
public void closeSession(@PathParam("username") String username, Session session){
//删除用户
USERS_ONLINE.remove(username);
//向所有在线用户发送用户下线通知消息
Iterator<Session> sessionIteratorr = USERS_ONLINE.values().iterator();
while (sessionIteratorr.hasNext()){
sessionIteratorr.next().getAsyncRemote().sendText( "["+username+"]离开了聊天室,当前在线数量:"+USERS_ONLINE.size());//异步发送
}
//下线后关闭session
try {
session.close();
} catch (IOException e) {
e.printStackTrace();
}
}
@OnMessage
public void onMessage(@PathParam("username") String username, String message){
//向聊天室中的人发送消息
Iterator<Session> sessionIteratorr = USERS_ONLINE.values().iterator();
while (sessionIteratorr.hasNext()){
sessionIteratorr.next().getAsyncRemote().sendText( "["+username+"]:" + message);//异步发送
}
}
@OnError
public void sessionError(Session session, Throwable throwable){
try {
session.close();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("WebSocket连接发生异常,message:"+throwable.getMessage());
}
}
4、新建一个html文件
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script type="text/javascript" src="../jquery.js"></script>
</head>
<body>
<button id="sendBtn" value="发送">发送</button>
<button id="leaveBtn" value="离开">离开</button>
<script type="text/javascript">
$(function(){
var webSocket = new WebSocket('ws://localhost:8181/online/'+$.getUrlParam("username"));
webSocket.onopen = function (){
console.log('webSocket连接创建。。。');
}
webSocket.onclose = function(){
console.log('本人已离开');
}
webSocket.onmessage = function(event){
console.log("收到消息:"+event.data)
}
webSocket.onerror = function (event) {
console.log('webSocket连接异常。。。');
}
//发送消息
$('#sendBtn').click(function(){
webSocket.send("123");
});
//退出聊天室
$('#leaveBtn').click(function(){
webSocket.close();
});
});</script>
</body>
</html>
5、简单demo已完成,结果如下图:
其他功能:
一、自定义类,实现HandshakeInterceptor 接口。
1、实现beforeHandshake方法(握手之前做啥),例如握手之前可以注册用户信息,绑定WebSocketSession等。
2、实现afterHandshake方法(握手之后做啥)
二、自定义类,实现WebSocketHandler 接口,实现例如:
1、afterConnectionEstablished方法(连接成功之后做啥)
2、handleMessage方法(处理要发送的消息)
3、handleTransportError方法(传输错误之后做啥)
4、afterConnectionClosed(连接关闭之后做啥)
三、自定义@Configuration配置类,实现 WebSocketConfigurer 接口,
1、重写registerWebSocketHandlers方法(配置允许访问的域、注册 Handler和拦截器)
例如:
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(MyWebSocketHandler, "/cate").addInterceptors(MyHandshakeInterceptor).setAllowedOrigins("*");
}
addInterceptors添加拦截器(第一步自定义的类)
addHandler添加对此次地址为/cate的websocket连接做处理的handler(第二步自定义的类)
setAllowedOrigins允许指定的域名连接