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

您的位置:首頁技術文章
文章詳情頁

SpringBoot+netty-socketio實現服務器端消息推送

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

首先:因為工作需要,需要對接socket.io框架對接,所以目前只能使用netty-socketio。websocket是不支持對接socket.io框架的。

netty-socketio顧名思義他是一個底層基于netty’實現的socket。

在springboot項目中的集成,請看下面的代碼

maven依賴

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

下面就是代碼了

首先是配置參數

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

上面的注釋寫的很清楚。下面是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('啟動正常'); }}

在就是監聽代碼

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; /** * 客戶端連接 * * @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('建立連接'); } /** * 客戶端斷開 * * @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('關閉連接'); } } //消息接收入口,當接收到消息后,查找發送目標客戶端,并且向該客戶端發送消息,且給自己發送消息 // 暫未使用 @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 用戶ID * @param sessionId 頁面sessionID * @param socketIOClient 頁面對應的通道連接信息 */ 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); } } /** * 根據用戶ID獲取所有通道信息 * @param userId * @return */ public HashMap<UUID, SocketIOClient> getUserClient(String userId){ return concurrentHashMap.get(userId); } /** * 根據用戶ID及頁面sessionID刪除頁面鏈接信息 * @param userId * @param sessionId */ public void deleteSessionClient(String userId,UUID sessionId){ concurrentHashMap.get(userId).remove(sessionId); }}

下面是存儲客戶端連接信息

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 用戶ID * @param sessionId 頁面sessionID * @param socketIOClient 頁面對應的通道連接信息 */ 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); } } /** * 根據用戶ID獲取所有通道信息 * @param userId * @return */ public HashMap<UUID, SocketIOClient> getUserClient(String userId){ return concurrentHashMap.get(userId); } /** * 根據用戶ID及頁面sessionID刪除頁面鏈接信息 * @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) -> { //向客戶端推送消息 socketIOClient.sendEvent('chatevent','服務端推送消息'); }); return 'success'; }}

到此這篇關于SpringBoot+netty-socketio實現服務器端消息推送的文章就介紹到這了,更多相關SpringBoot netty-socketio服務器端推送內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
丝瓜av网站精品一区二区| 亚洲成人一区在线观看| 成人日韩在线| 极品av在线| 裤袜国产欧美精品一区| 国产成人精品一区二区三区免费| 欧美日韩一区二区三区不卡视频| 青草久久视频| 久久av导航| 精品深夜福利视频| 国产va在线视频| 欧美综合另类| 免费日韩一区二区| 日本aⅴ亚洲精品中文乱码| 青青青国产精品| 国产亚洲一区二区三区啪| 国产精品igao视频网网址不卡日韩 | 日本成人在线视频网站| 日韩激情网站| 国产福利91精品一区二区| 欧美一区久久久| 99在线精品免费视频九九视 | 国产精品一区二区免费福利视频| 精品国内亚洲2022精品成人| 亚洲综合电影| 日韩欧美二区| 综合激情网...| 精品久久网站| 免费在线视频一区| 精品视频自拍| 性色av一区二区怡红| 欧美国产另类| 日韩中文欧美在线| 成人福利视频| 日本综合精品一区| 日韩欧美1区| 欧美亚洲三区| 日韩午夜一区| av在线资源| 国产欧美综合一区二区三区| 日韩国产综合| 日韩成人一级| 亚洲一区二区三区高清| 亚洲午夜天堂| 九九九精品视频| 国产精品v亚洲精品v日韩精品| 婷婷亚洲五月| 日韩精品dvd| 国产日韩免费| 在线看片日韩| 免费人成在线不卡| 国产精品一在线观看| 91欧美日韩在线| 亚洲综合国产| 99在线|亚洲一区二区| 日韩欧美中文| 水蜜桃久久夜色精品一区的特点| 国产一区丝袜| 国产精品久久久久久av公交车 | 日韩在线短视频| 91日韩欧美| 国产v日韩v欧美v| 成人午夜网址| 精品视频一区二区三区在线观看| 成人亚洲一区| 在线精品小视频| 亚洲精品影视| 精品国产亚洲一区二区三区在线 | 成人三级高清视频在线看| 亚洲国产福利| 日韩视频精品在线观看| 亚洲精选av| 精品国内亚洲2022精品成人| 久久三级视频| 亚洲青青久久| 国产一区2区| 久久精品99国产精品| 麻豆精品在线| 欧美久久久网站| 不卡中文一二三区| 91一区二区三区四区| 国产精品一区二区免费福利视频| 久久一区精品| 玖玖玖国产精品| 精品国产一区二区三区噜噜噜| 欧美日韩国产在线一区| 日韩中出av| 日韩激情一区| 日本aⅴ亚洲精品中文乱码| 97视频热人人精品免费| 日韩精品欧美激情一区二区| 中文字幕一区二区av| 欧美片第1页综合| 影音先锋国产精品| 18国产精品| 视频一区视频二区中文| 婷婷综合六月| 婷婷五月色综合香五月| 日韩一区电影| 国产欧美亚洲一区| 亚洲欧洲av| 夜夜嗨一区二区| 日韩不卡手机在线v区| 香蕉久久99| 欧美国产一级| 精品中文字幕一区二区三区| 国产一卡不卡| 欧美一区二区三区久久| 亚洲免费资源| 久久亚洲黄色| 久久亚洲专区| 日本久久综合| 婷婷精品在线| 亚洲三级在线| 国产毛片久久| 久久性天堂网| 久久国产成人| 99在线|亚洲一区二区| 桃色av一区二区| 久久精品伊人| 岛国av在线网站| 国产精品字幕| 亚洲精品va| 日本不卡一区二区| 国产美女亚洲精品7777| 国产福利资源一区| 国产精品成人**免费视频 | 中文无码日韩欧| 亚州精品视频| 精品国产一区二区三区av片| 91精品国产成人观看| 美腿丝袜在线亚洲一区| 久久av免费| 国产一区二区三区日韩精品| 国产黄色精品| 91综合久久爱com| 日本大胆欧美人术艺术动态| 鲁大师成人一区二区三区| 日韩精品首页| 99久久婷婷这里只有精品| 91国语精品自产拍| 在线看片一区| 欧美成a人片免费观看久久五月天| 麻豆视频久久| 欧美日韩国产v| 合欧美一区二区三区| 一区二区三区网站| 欧美激情一区| 久久久久久久久99精品大| 亚洲一区欧美激情| 欧美一区自拍| 成人片免费看| 一区二区国产精品| 日韩av一区二区三区四区| 麻豆成人在线观看| 91精品婷婷色在线观看| 亚洲另类视频| 麻豆精品av| 视频一区免费在线观看| 精品三级av| 蜜桃av一区二区| 丁香六月综合| 国产亚洲字幕| av亚洲免费| 精品视频一区二区三区在线观看| 亚洲国产日韩欧美在线| 国产成人久久精品麻豆二区| 午夜免费一区| 另类欧美日韩国产在线| 伊人久久亚洲美女图片| 欧美黄色精品| 亚洲精品乱码久久久久久蜜桃麻豆| 国产精品1区| 日本亚洲不卡| 亚洲黄色影院| 美女av在线免费看| 欧美激情五月| 日韩激情一区二区| 亚洲美洲欧洲综合国产一区| 国产成人精品一区二区免费看京| 中文字幕日韩欧美精品高清在线| 日韩av首页| 成人欧美一区二区三区的电影| 中文字幕一区二区精品区| 亚洲国产专区| 亚洲五月婷婷| 国产91精品对白在线播放| 精品国产aⅴ| 久久国产精品免费精品3p| 少妇精品久久久一区二区三区| 91久久在线| 午夜在线播放视频欧美| 尤物在线精品| 午夜在线播放视频欧美| 欧美日韩国产一区精品一区| 欧美日韩国产亚洲一区| 99精品99| 日本成人手机在线| 日韩中出av| 欧美日本不卡高清|