亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

微信小程序websocket聊天室的實(shí)現(xiàn)示例代碼

 更新時(shí)間:2019年02月12日 14:30:43   作者:極楽  
這篇文章主要介紹了微信小程序websocket聊天室的實(shí)現(xiàn)示例代碼,小程序本身對(duì)http、websocket等連接均有諸多限制,所以這次項(xiàng)目選擇了node.js自帶的ws模塊。感興趣的可以參考一下

背景

最近做了一個(gè)微信小程序的即時(shí)通訊功能,之前我也做過(guò)node.js的websocket服務(wù),不過(guò)是在web端應(yīng)用的socket.io服務(wù)。小程序本身對(duì)http、websocket等連接均有諸多限制,所以這次項(xiàng)目選擇了node.js自帶的ws模塊。

服務(wù)端

初始化一個(gè)node.js項(xiàng)目,引入ws模塊

const webSocket = require('ws');

創(chuàng)建websocket實(shí)例,并設(shè)置監(jiān)聽(tīng)端口

const wss = new webSocket.Server({
  port: 3001
});

定義wss實(shí)例方法,實(shí)現(xiàn)socket監(jiān)聽(tīng)和信息發(fā)布。下面貼上簡(jiǎn)單的示例:

wss.on('connection', function connection(ws, req) {
  console.log('連接開(kāi)啟')
  
  //發(fā)生錯(cuò)誤
  ws.on('error', function error(error) {
    console.log('error', error);
  });

  //斷開(kāi)連接
  ws.on('close', function close(close) {
    console.log( '已關(guān)閉');
  });

  ws.on('message', function message(message) {
    ws.send('客戶端發(fā)來(lái)了一條消息')
  });

  //發(fā)送消息
  ws.send('連接已開(kāi)啟');
  ws.send(id + '已連接')
});

這樣,一個(gè)簡(jiǎn)單的websocket服務(wù)就配置完成了。當(dāng)然,問(wèn)題遠(yuǎn)遠(yuǎn)不止這么簡(jiǎn)單。要想在小程序中進(jìn)行通信,還需要解決下面幾個(gè)問(wèn)題。

域名

關(guān)于小程序服務(wù)端域名配置,小程序開(kāi)發(fā)文檔中如下提到

小程序請(qǐng)求地址只支持https或者wss協(xié)議,因此首先要配置的就是SSL證書(shū)。拿到SSL證書(shū)之后,在服務(wù)端做一下https的配置即可。

var fs = require('fs');
const options = {
  key: fs.readFileSync('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 'utf8'),//證書(shū)地址
  cert: fs.readFileSync('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 'utf8'),//證書(shū)地址
};
var https = require('https');
var server = https.createServer(options, app);

另外值得注意的是,websocket監(jiān)聽(tīng)的端口號(hào)需要做一下代理,因?yàn)樾〕绦蛉绻慌渲枚丝谔?hào)時(shí),所有請(qǐng)求的url都不可以帶端口號(hào)。

多房間通信

先看一下廣播的實(shí)現(xiàn):

//廣播方法
wss.broadcast = function broadcast(data) {
  wss.clients.forEach(function each(client) {
    client.send(data)
  });
};

wss對(duì)象的clients是一個(gè)存儲(chǔ)著所有socket連接對(duì)象的數(shù)組,每條連接對(duì)象都可以調(diào)用各自的send方法發(fā)送信息。

在此基礎(chǔ)上,我們可以進(jìn)行一定的封裝,用一個(gè)唯一的標(biāo)識(shí)符映射到每一條socket連接,這樣我們需要向特定的某個(gè)連接發(fā)送信息時(shí),就可以找到該連接。

可以通過(guò)連接的url作為唯一標(biāo)識(shí):

 let sockets = {}
 wss.on('connection', function connection(ws, req) {
    let id = req.url.slice(5);//截幾位字符串根據(jù)自己實(shí)際獲得的url來(lái)看
    sockets[id] = ws;
    ws.send(id + '已連接');
    ...

客戶端每次連接時(shí)url后拼接一個(gè)唯一id,在服務(wù)端獲取req.url并截取字符串拿到唯一id,并將該連接對(duì)象存儲(chǔ)在全局的sockets下以便需要時(shí)使用。

在此基礎(chǔ)上,可以繼續(xù)封裝諸如加入房間、離開(kāi)房間、房間內(nèi)通信、向特定用戶私聊等功能,總體來(lái)說(shuō)是對(duì)send方法的封裝。值得注意的是send方法只能發(fā)送字符串,json對(duì)象需要轉(zhuǎn)化成字符串再傳入send。

下面是一個(gè)私聊的示例:

wss.notice = function notice(id, data, ws) {
  // 向指定id發(fā)送
  try {
    ws.send('正在發(fā)送...')
    var notice = JSON.stringify({
      type: 'notice',
      data: data
    })
    let target = sockets[id]
    if (target) {
      target.send('收到一條新消息')
      target.send(notice)
    } else {
      ws.send('目標(biāo)信道已關(guān)閉')
    }
  } catch (err) {
    console.log(err)
  }
}

到這里,一個(gè)簡(jiǎn)單的聊天室服務(wù)端配置就基本完成了。

最終作品效果如下:

部分代碼細(xì)節(jié),請(qǐng)觀眾老爺們移步 微信小程序中聊天室的服務(wù)端和客戶端配置示例 ^.^

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • JS中touchstart事件與click事件沖突的解決方法

    JS中touchstart事件與click事件沖突的解決方法

    這篇文章主要給大家介紹了關(guān)于JS中touchstart事件與click事件沖突的解決方法,文中通過(guò)示例代碼將解決的方法介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-03-03
  • 微信小程序之滑動(dòng)頁(yè)面隱藏和顯示組件功能的實(shí)現(xiàn)代碼

    微信小程序之滑動(dòng)頁(yè)面隱藏和顯示組件功能的實(shí)現(xiàn)代碼

    這篇文章主要介紹了微信小程序之滑動(dòng)頁(yè)面隱藏和顯示組件功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06
  • js實(shí)現(xiàn)查詢(xún)商品案例

    js實(shí)現(xiàn)查詢(xún)商品案例

    這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)查詢(xún)商品案例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • JavaScript調(diào)試之console.log調(diào)試的一個(gè)小技巧分享

    JavaScript調(diào)試之console.log調(diào)試的一個(gè)小技巧分享

    日常開(kāi)發(fā)中經(jīng)常會(huì)需要console來(lái)查看當(dāng)前對(duì)象的值。當(dāng)然用debugger會(huì)更全面的查看,但是總有只喜歡用console的,比如我。下面這篇文章主要給大家分享了關(guān)于JavaScript調(diào)試之console.log調(diào)試的一個(gè)小技巧,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-08-08
  • js添加事件的通用方法推薦

    js添加事件的通用方法推薦

    下面小編就為大家?guī)?lái)一篇js添加事件的通用方法推薦。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-05-05
  • JS繼承實(shí)現(xiàn)方法及優(yōu)缺點(diǎn)詳解

    JS繼承實(shí)現(xiàn)方法及優(yōu)缺點(diǎn)詳解

    這篇文章主要介紹了JS繼承實(shí)現(xiàn)方法及優(yōu)缺點(diǎn)詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • 一段批量給頁(yè)面上的控件賦值js

    一段批量給頁(yè)面上的控件賦值js

    一次性給頁(yè)面上的控件賦值,控件的ID和數(shù)據(jù)庫(kù)表字段對(duì)應(yīng)一樣,這樣就一次性搞定了
    2010-06-06
  • js單線程的本質(zhì) Event Loop解析

    js單線程的本質(zhì) Event Loop解析

    這篇文章主要介紹了js單線程的本質(zhì) Event Loop解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • js防止DIV布局滾動(dòng)時(shí)閃動(dòng)的解決方法

    js防止DIV布局滾動(dòng)時(shí)閃動(dòng)的解決方法

    這篇文章主要介紹了js防止DIV布局滾動(dòng)時(shí)閃動(dòng)的解決方法,通過(guò)js的window.requestAnimationFrame來(lái)解決這一問(wèn)題,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2014-10-10
  • JavaScript讓Textarea支持tab按鍵的方法

    JavaScript讓Textarea支持tab按鍵的方法

    這篇文章主要介紹了JavaScript讓Textarea支持tab按鍵的方法,涉及javascript針對(duì)textarea實(shí)現(xiàn)響應(yīng)tab按鍵的方法,需要的朋友可以參考下
    2015-06-06

最新評(píng)論