1.引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
2.编写配置文件
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
/**
* websocket配置文件
*
* @author LJH
* @since 2023-03-10
*/
@Component
public class WebSocketConfig {
/*<!--websocket-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>*/
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
}
3.编写WebSocket服务
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.concurrent.CopyOnWriteArraySet;
@Component
@Slf4j
@ServerEndpoint("/screen/webSocket/{sid}") // WebSocket服务地址
public class WebSocketServer {
private Session session;
private static CopyOnWriteArraySet<WebSocketServer> webSocketSet = new CopyOnWriteArraySet<>();
private String sid;// sid,用于区分不同的连接
// 建立连接
@OnOpen
public void onOpen(Session session, @PathParam("sid") String sid) {
this.session = session;
webSocketSet.add(this);
this.sid = sid;
log.info("[WebSocket消息]有新的连接,总数:{}", webSocketSet.size());
}
// 连接关闭
@OnClose
public void onClose() {
webSocketSet.remove(this);
log.info("[WebSocket消息]连接断开,总数:{}", webSocketSet.size());
}
@OnMessage
public void onMessage(String message) {
log.info("[WebSocket消息]收到客户端发来的消息:{}", message);
}
/**
* 发送消息
*
* @param message 消息内容
* @param sid 设备sid
*/
public void sendMessage(String message, String sid) {
for (WebSocketServer webSocket : webSocketSet) {
log.info("[WebSocket消息]向客户端发送消息:message={}", message);
try {
// 针对不同的连接推送数据,广播模式注释if即可
if (StringUtils.equals(webSocket.sid, sid)) {
webSocket.session.getBasicRemote().sendText(message);
}
} catch (IOException e) {
log.info("WebSocket 出错了!!!");
e.printStackTrace();
}
}
}
}