亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 課堂 > 小程序 > 正文

微信小程序使用websocket通訊的demo,含前后端代碼,親測可用

2020-03-21 15:55:31
字體:
來源:轉載
供稿:網友

0、概述websocket

(1) 個人總結:后臺設置了websocket地址,服務器開啟后等待有人去連接它。 一個客戶端一打開就去連接websocket地址,同時傳遞某些識別參數。這樣一來后臺和客戶端連接成功了,然后后臺就可以發消息給客戶端了,(客戶端也可以再回話給后臺)。

(2) socket叫套接字,應用程序用socket向網絡發出請求或者應答網絡請求。

(3) 官方解釋的socket 建立連接四步驟:

服務器端開啟socket,然后accep方法處于監聽狀態,等待客戶端的連接。

 客戶端開啟,指定服務器名稱和端口號來請求連接服務器端的socket。
 服務器端收到客戶端連接請求,返回連接確認。在服務器端,accept() 方法返回服務器上一個新的 socket 引用,該 socket 連接到客戶端的 socket。
 客戶端收到連接確認,兩個人就連接好了,雙方開始通訊

(4)注意:

客戶端的輸出流連接到服務器端的輸入流,而客戶端的輸入流連接到服務器端的輸出流。
TCP 是一個雙向的通信協議,因此數據可以通過兩個數據流在同一時間發送.

1、app.js寫法

在app.js下添加三個函數openSocket(), closeSocket(),sendMessage(),在app初始化的onLunch函數里面調用openSocket(),這樣子用戶一進入小程序就會自動連接websocket

App({  globalData: {  socketStatus: 'closed',  }, onLaunch: function() {   var that = this;  if (that.globalData.socketStatus === 'closed') {    that.openSocket();  } } openSocket() {  //打開時的動作  wx.onSocketOpen(() => {   console.log('WebSocket 已連接')   this.globalData.socketStatus = 'connected';   this.sendMessage();  })  //斷開時的動作  wx.onSocketClose(() => {   console.log('WebSocket 已斷開')   this.globalData.socketStatus = 'closed'  })  //報錯時的動作  wx.onSocketError(error => {   console.error('socket error:', error)  })  // 監聽服務器推送的消息  wx.onSocketMessage(message => {   //把JSONStr轉為JSON   message = message.data.replace(" ", "");   if (typeof message != 'object') {   message = message.replace(//ufeff/g, ""); //重點   var jj = JSON.parse(message);   message = jj;   }   console.log("【websocket監聽到消息】內容如下:");   console.log(message);  })  // 打開信道  wx.connectSocket({   url: "ws://" + "localhost" + ":8888",  })  }, //關閉信道  closeSocket() {  if (this.globalData.socketStatus === 'connected') {   wx.closeSocket({   success: () => {    this.globalData.socketStatus = 'closed'   }   })  }  },  //發送消息函數  sendMessage() {  if (this.globalData.socketStatus === 'connected') {  //自定義的發給后臺識別的參數 ,我這里發送的是name   wx.sendSocketMessage({   data: "{/"name/":/"" + wx.getStorageSync('openid') + "/"}"    })  }  },})

2、后臺寫法

主要有兩個類,一個是websocket啟動監聽交互類,一個是存儲當前所有已經連接好的用戶池以及對這些用戶的操作封裝類
 然后在項目啟動類里面調用websocke啟動監聽交互類的啟動方法。(如果是springboot項目,就直接在主類中調用)

(1)導入包

<dependency> <groupId>org.java-websocket</groupId> <artifactId>Java-WebSocket</artifactId> <version>1.3.0</version></dependency>
  

(2)啟動websocket的方法,放在啟動類里面   

 /**  * 啟動websocket  */ public void startWebsocketInstantMsg() {  WebSocketImpl.DEBUG = false;  MyWebScoket s;  s = new MyWebScoket(8888);  s.start();  System.out.println("websocket啟動成功"); }

(3)websocket監聽交互類如下

 該類涉及的監聽方法有:監聽用戶連入;監聽用戶斷開;監聽消息發過來;監聽有錯誤等

 

import com.alibaba.fastjson.JSONObject;import org.java_websocket.WebSocket;import org.java_websocket.handshake.ClientHandshake;import org.java_websocket.server.WebSocketServer;import java.net.InetSocketAddress;import java.net.UnknownHostException;import java.util.Map;public class MyWebScoket extends WebSocketServer { public MyWebScoket() throws UnknownHostException {  super(); } public MyWebScoket(int port) {  super(new InetSocketAddress(port)); } public MyWebScoket(InetSocketAddress address) {  super(address); } @Override public void onOpen(WebSocket conn, ClientHandshake handshake) {  // ws連接的時候觸發的代碼,onOpen中我們不做任何操作 } @Override public void onClose(WebSocket conn, int code, String reason, boolean remote) {  //斷開連接時候觸發代碼  userLeave(conn);  System.out.println(reason); } @Override public void onMessage(WebSocket conn, String message) {  //有用戶連接進來  Map<String, String> obj = (Map<String,String>) JSONObject.parse(message);  System.out.println(message);  String username = obj.get("name");  userJoin(conn, username); } @Override public void onError(WebSocket conn, Exception ex) {  //錯誤時候觸發的代碼  System.out.println("on error");  ex.printStackTrace(); } /**  * 去除掉失效的websocket鏈接  */ private void userLeave(WebSocket conn){  WsPool.removeUser(conn); } /**  * 將websocket加入用戶池  * @param conn  * @param userName  */ private void userJoin(WebSocket conn,String userName){  WsPool.addUser(userName, conn); }}

(4)用戶池類如下

 該類包含的方法有:從池中移除或添加用戶;獲取當前在線的所有用戶;通過參數"name"獲取某個用戶的當前WebSocket連接;給某個WebSocket連接發送消息;為所有WebSocket連接發送消息等等

 

import com.td.yousan.util.StringUtils;import org.java_websocket.WebSocket;import java.util.*;public class WsPool { private static final Map<WebSocket, String> wsUserMap = new HashMap<WebSocket, String>(); /**  * 通過websocket連接獲取其對應的用戶  */ public static String getUserByWs(WebSocket conn) {  return wsUserMap.get(conn); } /**  * 根據userName獲取WebSocket,這是一個list,此處取第一個  * 因為有可能多個websocket對應一個userName(但一般是只有一個,因為在close方法中,我們將失效的websocket連接去除了)  */ public static WebSocket getWsByUser(String userName) {  Set<WebSocket> keySet = wsUserMap.keySet();  synchronized (keySet) {   for (WebSocket conn : keySet) {    String cuser = wsUserMap.get(conn);    if (cuser.equals(userName)) {     return conn;    }   }  }  return null; } /**  * 向連接池中添加連接  */ public static void addUser(String userName, WebSocket conn) {  wsUserMap.put(conn, userName); // 添加連接 } /**  * 獲取所有連接池中的用戶,因為set是不允許重復的,所以可以得到無重復的user數組  */ public static Collection<String> getOnlineUser() {  List<String> setUsers = new ArrayList<String>();  Collection<String> setUser = wsUserMap.values();  for (String u : setUser) {   setUsers.add(u);  }  return setUsers; } /**  * 移除連接池中的連接  */ public static boolean removeUser(WebSocket conn) {  if (wsUserMap.containsKey(conn)) {   wsUserMap.remove(conn); // 移除連接   return true;  } else {   return false;  } } /**  * 向特定的用戶發送數據  */ public static void sendMessageToUser(WebSocket conn, String message) {  if (null != conn && null != wsUserMap.get(conn)) {   conn.send(message);  } } /**  * 向所有用戶名中包含某個特征得用戶發送消息  */ public static void sendMessageToSpecialUser(String message,String special) {  Set<WebSocket> keySet = wsUserMap.keySet();  if (special == null) {   special = "";  }  synchronized (keySet) {   for (WebSocket conn:keySet) {    String user = wsUserMap.get(conn);    try {     if (user != null) {      String [] cus = user.split("_");      if (!StringUtils.isNullOrEmpty(cus[0])) {       String cusDot = "," + cus[0] + ",";       if (cusDot.contains(","+special+",")) {         conn.send(message);       }      }else {       conn.send(message);      }     }    }catch (Exception e) {     e.printStackTrace();     //wsUserMap.remove(conn);    }   }  } } /**  * 向所有的用戶發送消息  */ public static void sendMessageToAll(String message) {  Set<WebSocket> keySet = wsUserMap.keySet();  synchronized (keySet) {   for (WebSocket conn : keySet) {    String user = wsUserMap.get(conn);    if (user != null) {     conn.send(message);    }   }  } }}

總結

以上所述是小編給大家介紹的微信小程序使用websocket通訊的demo,含前后端代碼,親測可用,希望對大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會及時回復大家的!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品国产乱码久久久久久虫虫漫画| 国产综合视频在线观看| 国产成一区二区| 亚洲a级在线观看| 久久国产加勒比精品无码| 国产美女主播一区| 91在线色戒在线| 久久天天躁狠狠躁夜夜躁2014| 国产一区二区三区欧美| 国产精品久久久久久久app| 日韩av毛片网| 国产精品久久久久久久久久99| 在线精品国产欧美| 2019中文字幕在线| 国产精品福利片| 国产丝袜一区二区三区免费视频| 久久久久日韩精品久久久男男| 精品亚洲男同gayvideo网站| 欧美激情videos| 超碰日本道色综合久久综合| 国产精品久久久久久网站| 91精品国产综合久久香蕉的用户体验| 国产一区二区色| 91影院在线免费观看视频| 日韩美女av在线| 国产精品久久久久久久电影| 91精品国产高清久久久久久| 亚洲欧美激情精品一区二区| 国产精品影院在线观看| 亚洲视频日韩精品| 欧美激情视频三区| 国产免费久久av| 91福利视频在线观看| 91精品久久久久久久久久久久久久| 亚洲深夜福利在线| 日韩成人在线视频| 成人欧美一区二区三区在线| 欧美大码xxxx| 久久久999国产精品| 国产精品日日做人人爱| 91精品国产九九九久久久亚洲| 亚洲欧美色婷婷| 国内精品400部情侣激情| 国产精品成人国产乱一区| 日韩a**中文字幕| 久久99久久99精品中文字幕| 亚洲一级黄色av| 国产乱肥老妇国产一区二| 色综合老司机第九色激情| 亚洲欧美一区二区激情| 国语自产在线不卡| 欧美伊久线香蕉线新在线| 日本aⅴ大伊香蕉精品视频| 亚洲系列中文字幕| 亚洲第一色中文字幕| 久久久久久久999精品视频| 国内揄拍国内精品| 永久免费看mv网站入口亚洲| 欧美一级免费视频| 亚洲欧洲一区二区三区久久| 欧美电影免费观看高清| 91夜夜未满十八勿入爽爽影院| 亚洲精品一区久久久久久| 最近日韩中文字幕中文| 欧日韩在线观看| 亚洲www在线| 国产精品啪视频| 亚洲精品国产美女| 国产精品欧美激情在线播放| 欧美激情一区二区三区成人| 欧美日韩国产在线播放| 久久成人免费视频| 日本韩国欧美精品大片卡二| 国产91在线播放九色快色| 欧美日产国产成人免费图片| 一个人www欧美| 在线观看视频99| 伊人久久综合97精品| 国产精自产拍久久久久久| 欧美高清视频在线观看| 国产精品日韩电影| 国产精品福利观看| 日韩中文字幕第一页| 久久久久北条麻妃免费看| 一本久久综合亚洲鲁鲁| 欧美午夜丰满在线18影院| 最近中文字幕mv在线一区二区三区四区| 欧美肥臀大乳一区二区免费视频| 国产在线视频91| 国产99久久精品一区二区 夜夜躁日日躁| 久久综合伊人77777| 日本在线观看天堂男亚洲| 欧美重口另类videos人妖| 一区二区三区四区视频| 亚洲自拍在线观看| 久久久国产在线视频| 高清一区二区三区四区五区| 久久久精品国产一区二区| 日本欧美在线视频| 欧美中文字幕在线播放| 久久免费观看视频| 青草青草久热精品视频在线网站| 国产精品999999| 亚洲影院色在线观看免费| 国产精品亚洲аv天堂网| 中文字幕一区电影| 麻豆国产精品va在线观看不卡| 久久韩国免费视频| 国产自摸综合网| 92福利视频午夜1000合集在线观看| 久久久精品一区二区三区| 国产成人一区二区三区| 91精品一区二区| 亚洲丝袜在线视频| 97久久久免费福利网址| 最近2019中文免费高清视频观看www99| 中文字幕亚洲激情| 国产精品99免视看9| 亚洲va电影大全| 久久影视电视剧免费网站清宫辞电视| 影音先锋日韩有码| 一本色道久久综合狠狠躁篇怎么玩| 亚洲精品xxxx| 中文字幕欧美亚洲| 精品中文字幕在线| 在线观看国产精品淫| 国产亚洲一区二区精品| 97人人模人人爽人人喊中文字| 57pao成人国产永久免费| 亚洲视频在线视频| 中文字幕av一区| 久久久久久久一| 亚洲精品91美女久久久久久久| 久久久久成人精品| 亚洲精品小视频在线观看| 91日本在线视频| 亚洲午夜av电影| 国产一区二区精品丝袜| 国产欧美精品久久久| 国产精品久久久久久久久久三级| 亚洲欧美中文日韩在线| 国产做受69高潮| 亚洲国产精品推荐| 久久久久久12| 国产成人一区二区三区| 日韩在线中文字| 亚洲视频在线观看免费| 国产精品中文久久久久久久| 亚洲美女自拍视频| 精品亚洲精品福利线在观看| 日韩精品中文字幕视频在线| 亚洲电影免费观看高清完整版在线观看| xx视频.9999.com| 亚洲成人国产精品| 久久久最新网址| 国内精品国产三级国产在线专| 亚洲电影在线看| 中文一区二区视频| 亚洲电影免费观看高清完整版在线观看| 欧美重口另类videos人妖| 亚洲免费av网址| 欧美激情免费看| 久久久精品久久| 91高清视频免费|