日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

SpringBoot+netty-socketio實(shí)現(xiàn)服務(wù)器端消息推送

瀏覽:154日期:2023-03-20 13:52:41

首先:因?yàn)楣ぷ餍枰枰獙?duì)接socket.io框架對(duì)接,所以目前只能使用netty-socketio。websocket是不支持對(duì)接socket.io框架的。

netty-socketio顧名思義他是一個(gè)底層基于netty’實(shí)現(xiàn)的socket。

在springboot項(xiàng)目中的集成,請(qǐng)看下面的代碼

maven依賴(lài)

<dependency> <groupId>com.corundumstudio.socketio</groupId> <artifactId>netty-socketio</artifactId> <version>1.7.11</version></dependency>

下面就是代碼了

首先是配置參數(shù)

#socketio配置socketio: host: localhost port: 9099 # 設(shè)置最大每幀處理數(shù)據(jù)的長(zhǎng)度,防止他人利用大數(shù)據(jù)來(lái)攻擊服務(wù)器 maxFramePayloadLength: 1048576 # 設(shè)置http交互最大內(nèi)容長(zhǎng)度 maxHttpContentLength: 1048576 # socket連接數(shù)大小(如只監(jiān)聽(tīng)一個(gè)端口boss線(xiàn)程組為1即可) bossCount: 1 workCount: 100 allowCustomRequests: true # 協(xié)議升級(jí)超時(shí)時(shí)間(毫秒),默認(rèn)10秒。HTTP握手升級(jí)為ws協(xié)議超時(shí)時(shí)間 upgradeTimeout: 1000000 # Ping消息超時(shí)時(shí)間(毫秒),默認(rèn)60秒,這個(gè)時(shí)間間隔內(nèi)沒(méi)有接收到心跳消息就會(huì)發(fā)送超時(shí)事件 pingTimeout: 6000000 # Ping消息間隔(毫秒),默認(rèn)25秒。客戶(hù)端向服務(wù)器發(fā)送一條心跳消息間隔 pingInterval: 25000

上面的注釋寫(xiě)的很清楚。下面是config代碼

import com.corundumstudio.socketio.Configuration;import com.corundumstudio.socketio.SocketConfig;import com.corundumstudio.socketio.SocketIOServer;import org.springframework.beans.factory.InitializingBean;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Value;import org.springframework.stereotype.Component;import javax.annotation.Resource;/** * kcm */@Componentpublic class PushServer implements InitializingBean { @Autowired private EventListenner eventListenner; @Value('${socketio.port}') private int serverPort; @Value('${socketio.host}') private String serverHost; @Value('${socketio.bossCount}') private int bossCount; @Value('${socketio.workCount}') private int workCount; @Value('${socketio.allowCustomRequests}') private boolean allowCustomRequests; @Value('${socketio.upgradeTimeout}') private int upgradeTimeout; @Value('${socketio.pingTimeout}') private int pingTimeout; @Value('${socketio.pingInterval}') private int pingInterval; @Override public void afterPropertiesSet() throws Exception { Configuration config = new Configuration(); config.setPort(serverPort); config.setHostname(serverHost); config.setBossThreads(bossCount); config.setWorkerThreads(workCount); config.setAllowCustomRequests(allowCustomRequests); config.setUpgradeTimeout(upgradeTimeout); config.setPingTimeout(pingTimeout); config.setPingInterval(pingInterval); SocketConfig socketConfig = new SocketConfig(); socketConfig.setReuseAddress(true); socketConfig.setTcpNoDelay(true); socketConfig.setSoLinger(0); config.setSocketConfig(socketConfig); SocketIOServer server = new SocketIOServer(config); server.addListeners(eventListenner); server.start(); System.out.println('啟動(dòng)正常'); }}

在就是監(jiān)聽(tīng)代碼

import com.corundumstudio.socketio.AckRequest;import com.corundumstudio.socketio.SocketIOClient;import com.corundumstudio.socketio.annotation.OnConnect;import com.corundumstudio.socketio.annotation.OnDisconnect;import com.corundumstudio.socketio.annotation.OnEvent;import org.apache.commons.lang3.StringUtils;import org.bangying.auth.JwtSupport;import org.springframework.stereotype.Component;import javax.annotation.Resource;import java.util.UUID;@Componentpublic class EventListenner { @Resource private ClientCache clientCache; @Resource private JwtSupport jwtSupport; /** * 客戶(hù)端連接 * * @param client */ @OnConnect public void onConnect(SocketIOClient client) { String userId = client.getHandshakeData().getSingleUrlParam('userId');// userId = jwtSupport.getApplicationUser().getId().toString();// userId = '8'; UUID sessionId = client.getSessionId(); clientCache.saveClient(userId, sessionId, client); System.out.println('建立連接'); } /** * 客戶(hù)端斷開(kāi) * * @param client */ @OnDisconnect public void onDisconnect(SocketIOClient client) { String userId = client.getHandshakeData().getSingleUrlParam('userId'); if (StringUtils.isNotBlank(userId)) { clientCache.deleteSessionClient(userId, client.getSessionId()); System.out.println('關(guān)閉連接'); } } //消息接收入口,當(dāng)接收到消息后,查找發(fā)送目標(biāo)客戶(hù)端,并且向該客戶(hù)端發(fā)送消息,且給自己發(fā)送消息 // 暫未使用 @OnEvent('messageevent') public void onEvent(SocketIOClient client, AckRequest request) { }}

本地緩存信息

import com.corundumstudio.socketio.SocketIOClient;import org.apache.commons.lang3.StringUtils;import org.springframework.stereotype.Component;import java.util.HashMap;import java.util.Map;import java.util.UUID;import java.util.concurrent.ConcurrentHashMap;/** * kcm */@Componentpublic class ClientCache { //本地緩存 private static Map<String, HashMap<UUID, SocketIOClient>> concurrentHashMap=new ConcurrentHashMap<>(); /** * 存入本地緩存 * @param userId 用戶(hù)ID * @param sessionId 頁(yè)面sessionID * @param socketIOClient 頁(yè)面對(duì)應(yīng)的通道連接信息 */ public void saveClient(String userId, UUID sessionId,SocketIOClient socketIOClient){ if(StringUtils.isNotBlank(userId)){ HashMap<UUID, SocketIOClient> sessionIdClientCache=concurrentHashMap.get(userId); if(sessionIdClientCache==null){sessionIdClientCache = new HashMap<>(); } sessionIdClientCache.put(sessionId,socketIOClient); concurrentHashMap.put(userId,sessionIdClientCache); } } /** * 根據(jù)用戶(hù)ID獲取所有通道信息 * @param userId * @return */ public HashMap<UUID, SocketIOClient> getUserClient(String userId){ return concurrentHashMap.get(userId); } /** * 根據(jù)用戶(hù)ID及頁(yè)面sessionID刪除頁(yè)面鏈接信息 * @param userId * @param sessionId */ public void deleteSessionClient(String userId,UUID sessionId){ concurrentHashMap.get(userId).remove(sessionId); }}

下面是存儲(chǔ)客戶(hù)端連接信息

import com.corundumstudio.socketio.SocketIOClient;import org.apache.commons.lang3.StringUtils;import org.springframework.stereotype.Component;import java.util.HashMap;import java.util.Map;import java.util.UUID;import java.util.concurrent.ConcurrentHashMap;/** * kcm */@Componentpublic class ClientCache { //本地緩存 private static Map<String, HashMap<UUID, SocketIOClient>> concurrentHashMap=new ConcurrentHashMap<>(); /** * 存入本地緩存 * @param userId 用戶(hù)ID * @param sessionId 頁(yè)面sessionID * @param socketIOClient 頁(yè)面對(duì)應(yīng)的通道連接信息 */ public void saveClient(String userId, UUID sessionId,SocketIOClient socketIOClient){ if(StringUtils.isNotBlank(userId)){ HashMap<UUID, SocketIOClient> sessionIdClientCache=concurrentHashMap.get(userId); if(sessionIdClientCache==null){sessionIdClientCache = new HashMap<>(); } sessionIdClientCache.put(sessionId,socketIOClient); concurrentHashMap.put(userId,sessionIdClientCache); } } /** * 根據(jù)用戶(hù)ID獲取所有通道信息 * @param userId * @return */ public HashMap<UUID, SocketIOClient> getUserClient(String userId){ return concurrentHashMap.get(userId); } /** * 根據(jù)用戶(hù)ID及頁(yè)面sessionID刪除頁(yè)面鏈接信息 * @param userId * @param sessionId */ public void deleteSessionClient(String userId,UUID sessionId){ concurrentHashMap.get(userId).remove(sessionId); }}

控制層推送方法

@RestController@RequestMapping('/push')public class PushController { @Resource private ClientCache clientCache; @Autowired private JwtSupport jwtSupport; @GetMapping('/message') public String pushTuUser(@Param('id') String id){ Integer userId = jwtSupport.getApplicationUser().getId(); HashMap<UUID, SocketIOClient> userClient = clientCache.getUserClient(String.valueOf(userId)); userClient.forEach((uuid, socketIOClient) -> { //向客戶(hù)端推送消息 socketIOClient.sendEvent('chatevent','服務(wù)端推送消息'); }); return 'success'; }}

到此這篇關(guān)于SpringBoot+netty-socketio實(shí)現(xiàn)服務(wù)器端消息推送的文章就介紹到這了,更多相關(guān)SpringBoot netty-socketio服務(wù)器端推送內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩网站中文字幕| 国产一卡不卡| 精品日韩视频| 91看片一区| 91精品1区| 香蕉成人久久| 蜜臀久久久99精品久久久久久| 亚洲欧美网站| 蜜臀av一区二区在线免费观看| 天堂成人免费av电影一区| 首页亚洲欧美制服丝腿| 在线国产精品一区| 日韩欧美中文字幕在线视频| 亚洲精品韩国| 日韩成人精品一区二区三区| 国产美女视频一区二区| 久久伊人久久| 日韩黄色大片网站| 在线一区免费| 亚洲精品亚洲人成在线观看| 国产精品调教| 天堂√8在线中文| 国产精品色网| 日本三级亚洲精品| 动漫av一区| 欧美日韩精品免费观看视频完整| 蜜芽一区二区三区| 国产精品theporn| 日韩在线第七页| 亚洲国产一区二区三区在线播放| 亚洲一区二区三区高清| 欧美在线日韩| 88xx成人免费观看视频库| 尤物tv在线精品| 亚洲精品一区二区在线播放∴| 国产精品a久久久久| 三级精品视频| 婷婷五月色综合香五月| 精品72久久久久中文字幕| 免费黄色成人| 国产探花一区| 香蕉精品视频在线观看| 青草国产精品| 性欧美xxxx免费岛国不卡电影| 日韩中文字幕不卡| 老司机精品视频网| 自拍日韩欧美| 国产精品入口久久| 亚洲小说欧美另类婷婷| 国产毛片精品| 欧洲激情综合| 免费看一区二区三区| 国产精品女主播一区二区三区| 久久精品一本| 中文字幕一区二区精品区| 久久精品国内一区二区三区| 中国女人久久久| 国产精品一站二站| 亚洲高清av| 国产视频一区二| 在线亚洲激情| 激情黄产视频在线免费观看| 免费成人在线视频观看| 色一区二区三区| 日本午夜精品久久久| 日韩高清中文字幕一区二区| 欧美综合社区国产| 一本一道久久a久久精品蜜桃| 免费看一区二区三区| 最新国产精品| 美女毛片一区二区三区四区| 精品精品99| 奇米777国产一区国产二区| 蜜臀av免费一区二区三区| 国产精品任我爽爆在线播放| 久久亚洲图片| 欧美色图国产精品| 久久91视频| 日韩av二区在线播放| 亚洲综合不卡| 久久中文亚洲字幕| 国产精品久久久久久久久久10秀 | 国产日韩视频在线| 日韩专区欧美专区| 久久久久欧美精品| 久久精品午夜| 欧美日韩视频免费看| 国产精品社区| 香蕉久久99| 日韩国产欧美| 精品亚洲二区| 国产精品欧美在线观看| 亚洲人成高清| 日韩中文字幕区一区有砖一区| 亚洲大全视频| 欧美午夜精品一区二区三区电影| 中文av在线全新| 精品少妇av| 免费精品一区| 美女尤物国产一区| 国产精品亚洲四区在线观看| 日本中文字幕不卡| 亚洲ab电影| 亚洲欧美高清| 天使萌一区二区三区免费观看| 悠悠资源网久久精品| 欧美va天堂| 性欧美69xoxoxoxo| 婷婷中文字幕一区| 99亚洲视频| 蜜臀精品一区二区三区在线观看| 丝袜美腿亚洲一区二区图片| 亚洲欧美日本视频在线观看| 在线视频日韩| 天堂成人国产精品一区| 伊人www22综合色| 亚洲综合专区| 婷婷视频一区二区三区| 伊人久久大香伊蕉在人线观看热v| 日韩精品一二三四| 久久午夜精品一区二区| 亚洲人成在线影院| 日韩av资源网| 国产精品亚洲欧美日韩一区在线 | 日韩一二三区在线观看| 日韩精品成人在线观看| 日韩国产欧美一区二区三区| 91福利精品在线观看| 国产亚洲第一伦理第一区| 国产精品网址| 精品国产91| 色在线视频观看| 久久精品国内一区二区三区水蜜桃| 欧美日中文字幕| 免费日韩av片| 97se亚洲| 成人午夜毛片| 欧美精选视频一区二区| 国产中文一区| 午夜一级久久| 97se亚洲| 日韩.com| 不卡一区2区| 蜜桃视频一区二区三区 | 国产伦乱精品| 久久精品福利| 久久久久亚洲| 在线免费观看亚洲| 国产精品白丝一区二区三区| 97在线精品| 亚洲一区日本| 国产亚洲欧美日韩在线观看一区二区| 国产一区福利| 亚洲激情中文在线| 欧美日韩1区| 黑人精品一区| 久久av在线| 国产精品tv| 在线日韩视频| 日本一区中文字幕| 久久精品国产精品亚洲毛片| 久久精品二区三区| 亚州欧美在线| 精品国产欧美日韩| 欧美在线影院| 国产午夜精品一区在线观看| 亚洲va中文在线播放免费| 欧美日韩免费观看一区=区三区| 精品视频在线一区二区在线| 国产精品一区免费在线| 国产理论在线| 日韩精品一二三四| 久久精品国产99国产精品| 国产99久久久国产精品成人免费| 在线国产日韩| 欧美激情亚洲| 黄在线观看免费网站ktv| 国产亚洲激情| 国产精品多人| 激情婷婷久久| 国产精品天天看天天狠| 伊人久久大香线蕉av不卡| 日韩中文av| 亚洲综合在线电影| 日本一区中文字幕| 欧美日韩中文一区二区| 国产欧美日韩精品高清二区综合区 | 亚洲久久一区| 国产成人精选| 免费看欧美美女黄的网站| 亚洲一区资源| 日韩黄色在线观看| 久久高清免费| 麻豆一区二区三| 蜜桃视频一区二区三区| 桃色一区二区| 久久国产麻豆精品| 91久久午夜| 福利一区在线| 久久激情av|