日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > C# >内容正文

C#

c# websocket 心跳重连_websocket的简单使用

發(fā)布時(shí)間:2024/4/11 C# 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c# websocket 心跳重连_websocket的简单使用 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1、maven項(xiàng)目,第一步需要配置jar包

org.springframework.boot

spring-boot-starter-websocket

2、前臺(tái)使用

var websocket = null;

//判斷當(dāng)前瀏覽器是否支持WebSocket

if('WebSocket' in window){

//連接WebSocket節(jié)點(diǎn)

websocket = new WebSocket("ws://localhost:81/api/imserver/"+用戶id;);

}else{

console.log("您的瀏覽器不支持WebSocket");

}

//連接發(fā)生錯(cuò)誤的回調(diào)方法

websocket.onerror = function(){

};

//連接成功建立的回調(diào)方法

websocket.onopen = function(event){

}

//接收到消息的回調(diào)方法

websocket.onmessage = function(event){

setMessageInnerHTML(event.data);

}

//連接關(guān)閉的回調(diào)方法

websocket.onclose = function(){

}

//發(fā)送消息

function send(){

var message = document.getElementById('text').value;

websocket.send(message);

}

窗口關(guān)閉或者退出登錄時(shí)調(diào)用,如果掛掉需要重新請(qǐng)求

//監(jiān)聽窗口關(guān)閉事件,當(dāng)窗口關(guān)閉時(shí),主動(dòng)去關(guān)閉websocket連接,防止連接還沒斷開就關(guān)閉窗口,server端會(huì)拋異常。

window.onbeforeunload = function(){

websocket.close();

}

前臺(tái)檢測(cè)后臺(tái)是否掛掉

//針對(duì)斷網(wǎng)的情況的心跳重連

var heartCheck = {

timeout: 20000,//20ms

timeoutObj: null,

reset: function( ){

clearTimeout(this.timeoutObj);

  this.start();

},

start: function( ){

this.timeoutObj = setTimeout(function(){

websocket.send("HeartBeat"); //自定義需要執(zhí)行的命令

}, this.timeout)

}

};

heartCheck.start();

heartCheck.reset();

//將消息顯示在網(wǎng)頁(yè)上

function setMessageInnerHTML(innerHTML){

document.getElementById('message').innerHTML += innerHTML + '
';

}

3、后臺(tái)使用

新建WebSocketConfig 類

@Configuration

public class WebSocketConfig {

@Bean

public ServerEndpointExporter serverEndpointExporter() {

return new ServerEndpointExporter();

}

}

新建WebSocketServer類

@ServerEndpoint(value="/imserver/{userId}")

@Component

public class WebSocketServer {

private final static Logger log = LoggerFactory.getLogger(WebSocketServer.class);

/**靜態(tài)變量,用來(lái)記錄當(dāng)前在線連接數(shù)。應(yīng)該把它設(shè)計(jì)成線程安全的。*/

private static int onlineCount = 0;

/**concurrent包的線程安全Set,用來(lái)存放每個(gè)客戶端對(duì)應(yīng)的MyWebSocket對(duì)象。*/

private static ConcurrentHashMap webSocketMap = new ConcurrentHashMap<>();

/**與某個(gè)客戶端的連接會(huì)話,需要通過(guò)它來(lái)給客戶端發(fā)送數(shù)據(jù)*/

private Session session;

/**接收userId*/

private String userId="";

/**

* 連接建立成功調(diào)用的方法

**/

@OnOpen

public void onOpen(Session session,@PathParam("userId") String userId) {

this.session = session;

this.userId=userId;

if(webSocketMap.containsKey(userId)){

webSocketMap.remove(userId);

webSocketMap.put(userId,this);

//加入set中

}else{

webSocketMap.put(userId,this);

//加入set中

addOnlineCount();

//在線數(shù)加1

}

log.info("用戶連接:"+userId+",當(dāng)前在線人數(shù)為:" + getOnlineCount());

try {

sendMessage("");

} catch (IOException e) {

log.error("用戶:"+userId+",網(wǎng)絡(luò)異常!!!!!!");

}

}

/**

* 連接關(guān)閉調(diào)用的方法

*/

@OnClose

public void onClose() {

if(webSocketMap.containsKey(userId)){

webSocketMap.remove(userId);

//從set中刪除

subOnlineCount();

}

log.info("用戶退出:"+userId+",當(dāng)前在線人數(shù)為:" + getOnlineCount());

}

/**

* 收到客戶端消息后調(diào)用的方法

*

* @param message 客戶端發(fā)送過(guò)來(lái)的消息*/

@OnMessage

public void onMessage(String message, Session session) {

//log.info("用戶消息:"+userId+",報(bào)文:"+message);

//可以群發(fā)消息

//消息保存到數(shù)據(jù)庫(kù)、redis

if(StringUtils.isNotBlank(message)){

try {

if("ping".equals(message)) {

webSocketMap.get(userId).sendMessage("pong");

}else {

//解析發(fā)送的報(bào)文

JSONObject jsonObject = JSON.parseObject(message);

//追加發(fā)送人(防止串改)

jsonObject.put("fromUserId",this.userId);

String toUserId=jsonObject.getString("toUserId");

//傳送給對(duì)應(yīng)toUserId用戶的websocket

if(StringUtils.isNotBlank(toUserId)&&webSocketMap.containsKey(toUserId)){

webSocketMap.get(toUserId).sendMessage(jsonObject.toJSONString());

}else{

log.error("請(qǐng)求的userId:"+toUserId+"不在該服務(wù)器上");

//否則不在這個(gè)服務(wù)器上,發(fā)送到mysql或者redis

}

}

}catch (Exception e){

e.printStackTrace();

}

}

}

/**

* 用戶錯(cuò)誤

* @param session

* @param error

*/

@OnError

public void onError(Session session, Throwable error) {

log.error("用戶錯(cuò)誤:"+this.userId+",原因:"+error.getMessage());

}

/**

* 實(shí)現(xiàn)服務(wù)器主動(dòng)推送

*/

public void sendMessage(String message) throws IOException {

this.session.getBasicRemote().sendText(message);

}

/**

* 發(fā)送自定義消息

* */

public static void sendInfo(String message,@PathParam("userId") String userId) {

try {

log.info("發(fā)送消息到:"+userId+",報(bào)文:"+message);

if(StringUtils.isNotBlank(userId)&&webSocketMap.containsKey(userId)){

webSocketMap.get(userId).sendMessage(message);

}else{

log.error("用戶"+userId+",不在線!");

}

} catch (Exception e) {

log.error("異常"+userId+",報(bào)文:"+message);

}

}

public static synchronized int getOnlineCount() {

return onlineCount;

}

public static synchronized void addOnlineCount() {

WebSocketServer.onlineCount++;

}

public static synchronized void subOnlineCount() {

WebSocketServer.onlineCount--;

}

}

后臺(tái)使用時(shí)調(diào)用其發(fā)送方法,前臺(tái)就可以收到,然后修改頁(yè)面顯示

WebSocketServer.sendInfo("",userid);

謝謝觀看!!!

總結(jié)

以上是生活随笔為你收集整理的c# websocket 心跳重连_websocket的简单使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 在线美女av | 中国性老太hd大全69 | 乱码av| 中文国语毛片高清视频 | 西西久久| 先锋av资源网站 | 国产福利91精品 | 超碰成人免费 | 色眯眯影院 | 国产精品亚洲一区二区 | 中文字字幕第183页 欧美特级一级片 | 9色av| 女同性αv亚洲女同志 | 寡妇高潮一级视频免费看 | 97人妻精品一区二区三区软件 | 国产免费无码XXXXX视频 | 久久国产经典 | 午夜精品一二三区 | 美女视频在线免费观看 | 视频一区 中文字幕 | 视频一区二区视频 | 亚洲天堂男人天堂 | 亚洲第一精品在线 | av电影在线观看网址 | 亚洲国产精品成人久久蜜臀 | 国产精品7777777 | 中文字幕久久网 | 亚洲爱情岛论坛永久 | 欧洲av无码放荡人妇网站 | 另类av小说 | 亚洲自拍偷拍网站 | 欧美天堂一区 | 拔插拔插影库 | 国产乱了高清露脸对白 | 中文亚洲av片不卡在线观看 | 亚洲天堂岛 | 免费看黄色片网站 | 青青草伊人久久 | 亚洲天堂中文字幕 | 九九热超碰 | 成人免费毛片东京热 | 在线cao | 国产l精品国产亚洲区久久 午夜青青草 | 欧洲亚洲精品 | 亚洲精品在线网站 | 色视频网站 | 少妇精品视频一区二区 | 午夜国产一区二区 | 国产福利免费观看 | 香蕉网在线观看 | 精品无码久久久久久国产 | 国产高潮呻吟久久 | 国产乱淫av麻豆国产 | 亚洲女女做受ⅹxx高潮 | 羞羞答答av | 日本中文字幕网 | 亚洲精品2 | 亚洲视频一区在线观看 | 日韩va在线观看 | 玖玖在线 | 亚洲精品久久久久久无码色欲四季 | 国产午夜免费福利 | 黄色靠逼视频 | 亚洲欧美强伦一区二区 | 日本少妇xxxx动漫 | 久久久婷| 亚洲国产精品久久AV | 四色成人网| 婷婷久久久| 69xav| 丰满熟女人妻一区二区三 | 国产精品一级二级三级 | 无码一区二区三区在线 | 亚洲高清视频免费观看 | 亚洲精品视频网址 | 亚洲精品粉嫩小泬20p | 农村村妇真实偷人视频 | 2017日日夜夜| 樱花草涩涩www在线播放 | 欧美丰满老妇 | 亚洲天堂视频在线 | 中文字幕在线色 | 影音先锋婷婷 | 欧美性视频播放 | av毛片大全 | 无码国产精品96久久久久 | 欧美一级啪啪 | 久久99网| 成人网视频 | 欧美成人黑人xx视频免费观看 | 91九色偷拍 | 巨大乳の揉んで乳榨り奶水 | 日日艹夜夜艹 | 欧美又粗又长 | 日韩欧美区 | 疯狂做爰高潮videossex | 老司机黄色片 | 精品一区二区三区在线观看视频 | 国产精品www色诱视频 |