@ServerEndpoint
注解是一个类层次的注解,它的功能主要是将目前的类定义成一个websocket服务器端,
注解的值将被用于监听用户连接的终端访问URL地址,客户端可以通过这个URL来连接到WebSocket服务器端
首先 maven中加入
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
WebSocket java代码
@Component
@ServerEndpoint(value = "/websocket/{username}")
public class WebSocket {
private static final Logger log = LoggerFactory.getLogger(WebSocket.class);
public static int onlineCount = 0;
public static Map<String, WebSocket> clients = new HashMap<String, WebSocket>();
public Session session;
public String username;
public String getUsername() {
return username;
}
@OnOpen
public void onOpen(@PathParam("username") String username, Session session) throws IOException {
this.username = username;
this.session = session;
addOnlineCount();
clients.put(session.getId(), this);
log.warn("已连接:"+username);
}
@OnClose
public void onClose() throws IOException {
log.warn("断开"+username);
clients.remove(session.getId());
subOnlineCount();
}
//收到客户端消息后调用的方法
@OnMessage
public void onMessage(String message) throws IOException {
if(message.equals("ping")) {
this.session.getAsyncRemote().sendText("pang");
}else if("close".equals(message)) {
onClose();
this.session.close();
}else {
log.warn(this.username+"收到 "+message);
}
}
@OnError
public void onError(Session session, Throwable error) {
error.printStackTrace();
}
public static void sendMessageTo(JSONObject json) {
log.warn("sendMsg:"+json);
for (WebSocket item : clients.values()) {
item.session.getAsyncRemote().sendText(json.toJSONString());
}
}
public static void clearMessageFromOpen(String message) {
try {
JSONObject json = JSONObject.parseObject(message);
if(json.get("uuid") != null) {
}
} catch (Exception e) {
}
}
public static synchronized int getOnlineCount() {
return onlineCount;
}
public static synchronized void addOnlineCount() {
WebSocket.onlineCount++;
}
public static synchronized void subOnlineCount() {
WebSocket.onlineCount--;
}
public static synchronized Map<String, WebSocket> getClients() {
return clients;
}
}
在RunApplication中加入
/**
* 会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint
* 要注意,如果使用独立的servlet容器,
* 而不是直接使用springboot的内置容器,
* 就不要注入ServerEndpointExporter,因为它将由容器自己提供和管理。
*/
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}