目錄
握手?jǐn)r截器
WebSocket處理程序
HttpSessionHandshakelnterceptor (抽象類):? ?握手?jǐn)r截器,在握手前后添加操作
AbstractWebSocketHandler (抽象類) :? ?WebSocket處理程序,監(jiān)聽連接前,連接中,連接后WebSocketConfigurer (接口):? ? 配置程序,比如配置監(jiān)聽哪個端口,上面的握手?jǐn)r截器,處理程序的使用文章來源:http://www.zghlxwxcb.cn/news/detail-794992.html
握手?jǐn)r截器
?握手?jǐn)r截器,在握手前后添加操作文章來源地址http://www.zghlxwxcb.cn/news/detail-794992.html
//握手?jǐn)r截器
@Component
@Slf4j
public class MyWsInterceptor extends HttpSessionHandshakeInterceptor {
//用戶開始連接
@Override
public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception {
//從reuqest獲取遠(yuǎn)程的地址
log.info("{}==》開始握手", request.getRemoteAddress().toString());
return super.beforeHandshake(request, response, wsHandler, attributes);
}
@Override
public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception ex) {
//從reuqest獲取遠(yuǎn)程的地址
log.info("{}==》握手成功后的返回", request.getRemoteAddress().toString());
super.afterHandshake(request, response, wsHandler, ex);
}
}
WebSocket處理程序
//WebSocket處理程序
@Slf4j
@Component //注入spring進(jìn)來
public class MyWsHandler extends AbstractWebSocketHandler {
//同樣的,為了快速訪問,使用map去取值
private static Map<String, SessionBean> map;
//縣線程安全的Integer
private static AtomicInteger clientIdMaker;
static {
map = new ConcurrentHashMap<>();
clientIdMaker = new AtomicInteger(0);
}
@Override
//連接建立后,保存session連接,保存在類對象map中
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
super.afterConnectionEstablished(session);
//返回并自增//半自定義操作
SessionBean sessionBean = new SessionBean(session, clientIdMaker.getAndIncrement());
map.put(session.getId(), sessionBean);
//自定義操作
//sb.append(map.get(session.getId()).getClientId() + "進(jìn)入了群聊<br/>");
//sengMessage(map);
}
@Override
//收到消息
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
super.handleTextMessage(session, message);
//sb.append(map.get(session.getId()).getClientId() + ":傳輸?shù)膬?nèi)容:" + message.getPayload() + "<br/>");
//log.info(String.valueOf(sb));
//sengMessage(map);
}
@Override
//傳輸出現(xiàn)異常
public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
log.info("傳輸出現(xiàn)異常");
super.handleTransportError(session, exception);
if (session.isOpen()) {
log.info("傳輸出現(xiàn)異常,關(guān)閉session");
session.close();
map.remove(session.getId());
}
}
@Override
//連接關(guān)閉
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
super.afterConnectionClosed(session, status);
map.remove(session.getId());
//Integer clientId = map.get(session.getId()).getClientId();
//log.info("()==>連接關(guān)閉", clientId);
//sb.append(clientId + "退出了群聊" + "<br/>");
//sengMessage(map);
}
//實(shí)現(xiàn)定時任務(wù)
@Scheduled(fixedRate = 2000) //每隔多少秒執(zhí)行定時任務(wù)
public void sengMsg() throws IOException {
//向每個客戶端發(fā)送請求
for (String s : map.keySet()) { //遍歷對象
map.get(s) //或與session對象
.getWebSocketSession() //獲取session
.sendMessage(new TextMessage("測試心跳")); //發(fā)送任務(wù)
}
}
static void sengMessage(Map<String, SessionBean> map) {
for (String key : map.keySet()) {
try {
map.get(key).getWebSocketSession().sendMessage(new TextMessage(sb.toString()));
} catch (IOException e) {
e.printStackTrace();
log.info(e.getMessage());
}
}
}
}
配置類
@Configuration
@EnableWebSocket
public class MyWsConfig implements WebSocketConfigurer {
@Resource
private MyWsHandler handler;
@Resource
private MyWsInterceptor interceptor;
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(handler, "/myWs1") //傳入處理器,以及handler監(jiān)聽的地址
.addInterceptors(interceptor) //添加攔截器 注入自定義的握手?jǐn)r截器
.setAllowedOrigins("*"); //允許的源
}
}
到了這里,關(guān)于WebSocket--整合springboot的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!