最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2019年05月22日 15:25:55   作者:華噠妹妹  
這篇文章主要介紹了微信小程序使用websocket通訊的demo,含前后端代碼,親測(cè)可用,需要的朋友可以參考下

0、概述websocket

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

(2) socket叫套接字,應(yīng)用程序用socket向網(wǎng)絡(luò)發(fā)出請(qǐng)求或者應(yīng)答網(wǎng)絡(luò)請(qǐng)求。

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

服務(wù)器端開(kāi)啟socket,然后accep方法處于監(jiān)聽(tīng)狀態(tài),等待客戶端的連接。

 客戶端開(kāi)啟,指定服務(wù)器名稱和端口號(hào)來(lái)請(qǐng)求連接服務(wù)器端的socket。
 服務(wù)器端收到客戶端連接請(qǐng)求,返回連接確認(rèn)。在服務(wù)器端,accept() 方法返回服務(wù)器上一個(gè)新的 socket 引用,該 socket 連接到客戶端的 socket。
 客戶端收到連接確認(rèn),兩個(gè)人就連接好了,雙方開(kāi)始通訊

(4)注意:

客戶端的輸出流連接到服務(wù)器端的輸入流,而客戶端的輸入流連接到服務(wù)器端的輸出流。
TCP 是一個(gè)雙向的通信協(xié)議,因此數(shù)據(jù)可以通過(guò)兩個(gè)數(shù)據(jù)流在同一時(shí)間發(fā)送.

1、app.js寫法

在app.js下添加三個(gè)函數(shù)openSocket(), closeSocket(),sendMessage(),在app初始化的onLunch函數(shù)里面調(diào)用openSocket(),這樣子用戶一進(jìn)入小程序就會(huì)自動(dòng)連接websocket

App({
  globalData: {
  socketStatus: 'closed',
  },
 onLaunch: function() { 
  var that = this;
  if (that.globalData.socketStatus === 'closed') {
    that.openSocket();
  }
 }
 openSocket() {
  //打開(kāi)時(shí)的動(dòng)作
  wx.onSocketOpen(() => {
   console.log('WebSocket 已連接')
   this.globalData.socketStatus = 'connected';
   this.sendMessage();
  })
  //斷開(kāi)時(shí)的動(dòng)作
  wx.onSocketClose(() => {
   console.log('WebSocket 已斷開(kāi)')
   this.globalData.socketStatus = 'closed'
  })
  //報(bào)錯(cuò)時(shí)的動(dòng)作
  wx.onSocketError(error => {
   console.error('socket error:', error)
  })
  // 監(jiān)聽(tīng)服務(wù)器推送的消息
  wx.onSocketMessage(message => {
   //把JSONStr轉(zhuǎn)為JSON
   message = message.data.replace(" ", "");
   if (typeof message != 'object') {
   message = message.replace(/\ufeff/g, ""); //重點(diǎn)
   var jj = JSON.parse(message);
   message = jj;
   }
   console.log("【websocket監(jiān)聽(tīng)到消息】?jī)?nèi)容如下:");
   console.log(message);
  })
  // 打開(kāi)信道
  wx.connectSocket({
   url: "ws://" + "localhost" + ":8888",
  })
  },
 //關(guān)閉信道
  closeSocket() {
  if (this.globalData.socketStatus === 'connected') {
   wx.closeSocket({
   success: () => {
    this.globalData.socketStatus = 'closed'
   }
   })
  }
  },
  //發(fā)送消息函數(shù)
  sendMessage() {
  if (this.globalData.socketStatus === 'connected') {
  //自定義的發(fā)給后臺(tái)識(shí)別的參數(shù) ,我這里發(fā)送的是name
   wx.sendSocketMessage({
   data: "{\"name\":\"" + wx.getStorageSync('openid') + "\"}" 
   })
  }
  },
})

2、后臺(tái)寫法

主要有兩個(gè)類,一個(gè)是websocket啟動(dòng)監(jiān)聽(tīng)交互類,一個(gè)是存儲(chǔ)當(dāng)前所有已經(jīng)連接好的用戶池以及對(duì)這些用戶的操作封裝類
 然后在項(xiàng)目啟動(dòng)類里面調(diào)用websocke啟動(dòng)監(jiān)聽(tīng)交互類的啟動(dòng)方法。(如果是springboot項(xiàng)目,就直接在主類中調(diào)用)

(1)導(dǎo)入包

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

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

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

(3)websocket監(jiān)聽(tīng)交互類如下

 該類涉及的監(jiān)聽(tīng)方法有:監(jiān)聽(tīng)用戶連入;監(jiān)聽(tīng)用戶斷開(kāi);監(jiān)聽(tīng)消息發(fā)過(guò)來(lái);監(jiān)聽(tīng)有錯(cuò)誤等

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連接的時(shí)候觸發(fā)的代碼,onOpen中我們不做任何操作
 }
 @Override
 public void onClose(WebSocket conn, int code, String reason, boolean remote) {
  //斷開(kāi)連接時(shí)候觸發(fā)代碼
  userLeave(conn);
  System.out.println(reason);
 }
 @Override
 public void onMessage(WebSocket conn, String message) {
  //有用戶連接進(jìn)來(lái)
  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) {
  //錯(cuò)誤時(shí)候觸發(fā)的代碼
  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)用戶池類如下

 該類包含的方法有:從池中移除或添加用戶;獲取當(dāng)前在線的所有用戶;通過(guò)參數(shù)"name"獲取某個(gè)用戶的當(dāng)前WebSocket連接;給某個(gè)WebSocket連接發(fā)送消息;為所有WebSocket連接發(fā)送消息等等

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>();
 /**
  * 通過(guò)websocket連接獲取其對(duì)應(yīng)的用戶
  */
 public static String getUserByWs(WebSocket conn) {
  return wsUserMap.get(conn);
 }
 /**
  * 根據(jù)userName獲取WebSocket,這是一個(gè)list,此處取第一個(gè)
  * 因?yàn)橛锌赡芏鄠€(gè)websocket對(duì)應(yīng)一個(gè)userName(但一般是只有一個(gè),因?yàn)樵赾lose方法中,我們將失效的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); // 添加連接
 }
 /**
  * 獲取所有連接池中的用戶,因?yàn)閟et是不允許重復(fù)的,所以可以得到無(wú)重復(fù)的user數(shù)組
  */
 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;
  }
 }
 /**
  * 向特定的用戶發(fā)送數(shù)據(jù)
  */
 public static void sendMessageToUser(WebSocket conn, String message) {
  if (null != conn && null != wsUserMap.get(conn)) {
   conn.send(message);
  }
 }
 /**
  * 向所有用戶名中包含某個(gè)特征得用戶發(fā)送消息
  */
 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);
    }
   }
  }
 }
 /**
  * 向所有的用戶發(fā)送消息
  */
 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);
    }
   }
  }
 }
}

總結(jié)

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

相關(guān)文章

  • Bootstrap table使用方法總結(jié)

    Bootstrap table使用方法總結(jié)

    這篇文章主要總結(jié)介紹了Bootstrap table的使用方法,服務(wù)器分頁(yè)、客戶端分頁(yè)的轉(zhuǎn)換,table刷新,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • JS正則表達(dá)式之非捕獲分組用法實(shí)例分析

    JS正則表達(dá)式之非捕獲分組用法實(shí)例分析

    這篇文章主要介紹了JS正則表達(dá)式之非捕獲分組用法,結(jié)合實(shí)例形式詳細(xì)分析了正則表達(dá)式中非捕獲分組的概念、功能、使用方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2016-12-12
  • 基于JavaScript實(shí)現(xiàn)表單密碼的隱藏和顯示出來(lái)

    基于JavaScript實(shí)現(xiàn)表單密碼的隱藏和顯示出來(lái)

    為了網(wǎng)站的安全性,很多朋友都把密碼設(shè)的比較復(fù)雜,但是如何密碼不能明顯示,不知道輸?shù)氖菍?duì)是錯(cuò),為了安全起見(jiàn)可以把密碼顯示的,那么基于js代碼如何實(shí)現(xiàn)的呢?下面通過(guò)本文給大家介紹JavaScript實(shí)現(xiàn)表單密碼的隱藏和顯示,需要的朋友參考下
    2016-03-03
  • JS中Swiper的使用和輪播圖效果

    JS中Swiper的使用和輪播圖效果

    Swiper是移動(dòng)端的一款非常強(qiáng)大的觸摸滑動(dòng)插件。下面通過(guò)本文給大家分享JS中Swiper的使用和輪播圖效果,感興趣的的朋友一起看看吧
    2017-08-08
  • JS簡(jiǎn)單實(shí)現(xiàn)數(shù)組去重的方法分析

    JS簡(jiǎn)單實(shí)現(xiàn)數(shù)組去重的方法分析

    這篇文章主要介紹了JS簡(jiǎn)單實(shí)現(xiàn)數(shù)組去重的方法,結(jié)合具體實(shí)例形式分析了javascript數(shù)組遍歷、判斷實(shí)現(xiàn)去重復(fù)的相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下
    2017-10-10
  • javascript 獲取鼠標(biāo)的絕對(duì)位置 event

    javascript 獲取鼠標(biāo)的絕對(duì)位置 event

    javascript 獲取鼠標(biāo)的絕對(duì)位置 event
    2009-06-06
  • Javascript中的方法和匿名方法實(shí)例詳解

    Javascript中的方法和匿名方法實(shí)例詳解

    這篇文章主要介紹了Javascript中的方法和匿名方法,以實(shí)例形式較為詳細(xì)的分析了javascript中方法及匿名方法的定義與使用技巧,需要的朋友可以參考下
    2015-06-06
  • JS跳轉(zhuǎn)手機(jī)站url的若干注意事項(xiàng)

    JS跳轉(zhuǎn)手機(jī)站url的若干注意事項(xiàng)

    去年年底開(kāi)發(fā)了一個(gè)手機(jī)站平臺(tái),遇到了很多坎,今天小編給大家分享下使用JS跳轉(zhuǎn)手機(jī)站url的若干注意事項(xiàng),需要的朋友參考下吧
    2017-10-10
  • 微信小程序?qū)崿F(xiàn)一鍵登錄

    微信小程序?qū)崿F(xiàn)一鍵登錄

    這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)一鍵登錄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • ajax級(jí)聯(lián)菜單實(shí)現(xiàn)方法實(shí)例分析

    ajax級(jí)聯(lián)菜單實(shí)現(xiàn)方法實(shí)例分析

    這篇文章主要介紹了ajax級(jí)聯(lián)菜單實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了基于ajax與后臺(tái)php交互實(shí)現(xiàn)級(jí)聯(lián)菜單功能的相關(guān)操作技巧,需要的朋友可以參考下
    2016-11-11

最新評(píng)論

桃园县| 江口县| 桐柏县| 岐山县| 华池县| 延庆县| 定襄县| 保定市| 连山| 南宫市| 康乐县| 桂平市| 如皋市| 鞍山市| 临潭县| 海丰县| 繁昌县| 中西区| 西峡县| 临城县| 湛江市| 军事| 隆安县| 巴彦淖尔市| 滨州市| 桦甸市| 宁明县| 佳木斯市| 娱乐| 尤溪县| 曲水县| 胶南市| 本溪市| 邵阳市| 大埔区| 桦南县| 鹤山市| 通渭县| 东台市| 增城市| 新源县|