首先需要maven配置
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
<version>2.1.3.RELEASE</version>
</dependency>
然后加上配置類
這段代碼是一個(gè)Spring配置類,主要作用是注冊(cè)WebSocket端點(diǎn),讓使用了`@ServerEndpoint`注解聲明的WebSocket端點(diǎn)能夠自動(dòng)注冊(cè)并生效。具體來(lái)說:
- `@Configuration`注解表明這是一個(gè)配置類,Spring會(huì)自動(dòng)掃描并加載這個(gè)配置類。
- `@Bean`注解標(biāo)記了`serverEndpointExporter()`方法,這個(gè)方法返回一個(gè)`ServerEndpointExporter`實(shí)例。
- `ServerEndpointExporter` 是一個(gè)特殊的Spring Bean,它的作用是自動(dòng)注冊(cè)使用`@ServerEndpoint`注解聲明的WebSocket端點(diǎn)。
簡(jiǎn)單來(lái)說,通過這段代碼配置,Spring會(huì)掃描項(xiàng)目中使用`@ServerEndpoint`注解聲明的WebSocket端點(diǎn),并自動(dòng)注冊(cè)這些端點(diǎn),使它們能夠被正確地映射和使用。
總的來(lái)說,這個(gè)配置類的作用是為WebSocket端點(diǎn)的自動(dòng)注冊(cè)提供支持,簡(jiǎn)化了WebSocket端點(diǎn)的配置過程,讓開發(fā)者更方便地使用WebSocket功能。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-847126.html
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
@Configuration
public class WebSocketClientConfig {
/**
* ServerEndpointExporter 作用
*
* 這個(gè)Bean會(huì)自動(dòng)注冊(cè)使用@ServerEndpoint注解聲明的websocket endpoint
*
* @return
*/
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
}
最后加上主程序文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-847126.html
@ServerEndpoint(value = "/imserver/{username}")
@Component
public class WebSocketServer {
private static final Logger log = LoggerFactory.getLogger(WebSocketServer.class);
/**
* 記錄當(dāng)前在線連接數(shù)
*/
public static final Map<String, Session> sessionMap = new ConcurrentHashMap<>();
/**
* 連接建立成功調(diào)用的方法
*/
@OnOpen
public void onOpen(Session session, @PathParam("username") String username) {
sessionMap.put(username, session);
log.info("有新用戶加入,username={}, 當(dāng)前在線人數(shù)為:{}", username, sessionMap.size());
JSONObject result = new JSONObject();
JSONArray array = new JSONArray();
result.set("users", array);
for (Object key : sessionMap.keySet()) {
JSONObject jsonObject = new JSONObject();
jsonObject.set("username", key);
array.add(jsonObject);
}
sendAllMessage(JSONUtil.toJsonStr(result));
}
/**
* 連接關(guān)閉調(diào)用的方法
*/
@OnClose
public void onClose(Session session, @PathParam("username") String username) {
sessionMap.remove(username);
log.info("有一連接關(guān)閉,移除username={}的用戶session, 當(dāng)前在線人數(shù)為:{}", username, sessionMap.size());
}
/**
* 收到客戶端消息后調(diào)用的方法
* 后臺(tái)收到客戶端發(fā)送過來(lái)的消息
* onMessage 是一個(gè)消息的中轉(zhuǎn)站
* 接受 瀏覽器端 socket.send 發(fā)送過來(lái)的 json數(shù)據(jù)
* @param message 客戶端發(fā)送過來(lái)的消息
*/
@OnMessage
public void onMessage(String message, Session session, @PathParam("username") String username) {
log.info("服務(wù)端收到用戶username={}的消息:{}", username, message);
JSONObject obj = JSONUtil.parseObj(message);
String toUsername = obj.getStr("to");
String text = obj.getStr("text");
Session toSession = sessionMap.get(toUsername);
if (toSession != null) {
JSONObject jsonObject = new JSONObject();
jsonObject.set("from", username);
jsonObject.set("text", text);
this.sendMessage(jsonObject.toString(), toSession);
log.info("發(fā)送給用戶username={},消息:{}", toUsername, jsonObject.toString());
} else {
log.info("發(fā)送失敗,未找到用戶username={}的session", toUsername);
}
}
@OnError
public void onError(Session session, Throwable error) {
log.error("發(fā)生錯(cuò)誤");
error.printStackTrace();
}
/**
* 服務(wù)端發(fā)送消息給客戶端
*/
private void sendMessage(String message, Session toSession) {
try {
log.info("服務(wù)端給客戶端[{}]發(fā)送消息{}", toSession.getId(), message);
toSession.getBasicRemote().sendText(message);
} catch (Exception e) {
log.error("服務(wù)端發(fā)送消息給客戶端失敗", e);
}
}
/**
* 服務(wù)端發(fā)送消息給所有客戶端
*/
private void sendAllMessage(String message) {
try {
for (Session session : sessionMap.values()) {
log.info("服務(wù)端給客戶端[{}]發(fā)送消息{}", session.getId(), message);
session.getBasicRemote().sendText(message);
}
} catch (Exception e) {
log.error("服務(wù)端發(fā)送消息給客戶端失敗", e);
}
}
}
到了這里,關(guān)于WebSocketServer后端配置,精簡(jiǎn)版的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!