一、引入spring-websocket依赖

1
2
3
4
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-websocket</artifactId>
</dependency>

二、开启websocket支持

1
2
3
4
5
6
7
8
9
10
11
/**
* 开启websocket的支持
*/
@Configuration
public class WebsocketConfig {

@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
}

三、websocket工具类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/**
* websocket工具类
*/
@Slf4j
public class WebsocketUtil {

private WebsocketUtil() {
}

/**
* 服务端存放客户端对应的session对象
* key:clientId value:session
*/
public static final Map<String, Session> WEBSOCKET_CLIENT_SESSION_MAP = Maps.newConcurrentMap();

/**
* 服务端发送消息给所有客户端
*
* @param message
*/
public static void sendMessageToAllClient(String message) {
if (WEBSOCKET_CLIENT_SESSION_MAP.isEmpty()) {
log.info("当前无连接的客户端, 消息忽略推送.");
return;
}
WEBSOCKET_CLIENT_SESSION_MAP.forEach((sessionId, session) -> {
try {
session.getBasicRemote().sendText(message);
} catch (Exception e) {
log.error("服务端向客户端[{}]发送消息异常.", sessionId, e);
}
});
}
}

四、websocket服务端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
/**
* websocket服务端
*/
@Slf4j
@Component
@ServerEndpoint("/websocket")
public class WebsocketServer {

private String sessionId;

/**
* websocket建立连接
*
* @param session
* @throws IOException
*/
@OnOpen
public void onOpen(Session session) throws IOException {
this.sessionId = session.getId();

if (WebsocketUtil.WEBSOCKET_CLIENT_SESSION_MAP.containsKey(this.sessionId)) {
WebsocketUtil.WEBSOCKET_CLIENT_SESSION_MAP.remove(this.sessionId).close();
}

WebsocketUtil.WEBSOCKET_CLIENT_SESSION_MAP.put(this.sessionId, session);

log.info("客户端[{}]建立websocket连接.", this.sessionId);
}

/**
* 关闭socket连接
*
* @param session
*/
@OnClose
public void onClose(Session session) {
if (WebsocketUtil.WEBSOCKET_CLIENT_SESSION_MAP.containsKey(session.getId())) {
WebsocketUtil.WEBSOCKET_CLIENT_SESSION_MAP.remove(session.getId());
log.info("客户端[{}]断开websocket连接.", session.getId());
}
}

/**
* 接收到消息
*
* @param message
*/
@OnMessage
public void OnMessage(String message) {
log.info("接收到客户端{}发送的消息:[{}].", this.sessionId, message);
}

/**
* 连接错误
*
* @param session
* @param error
*/
@OnError
public void OnError(Session session, Throwable error) {
log.error("websocket连接错误,", error);
}
}

五、测试

推荐使用Chrome插件–Simple Web Socket Client