怎么在微信小程序中實(shí)現(xiàn)一個(gè)websocket聊天室

本篇文章給大家分享的是有關(guān)怎么在微信小程序中實(shí)現(xiàn)一個(gè)websocket聊天室,小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。

創(chuàng)新互聯(lián)公司專注于景洪網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供景洪營(yíng)銷型網(wǎng)站建設(shè),景洪網(wǎng)站制作、景洪網(wǎng)頁(yè)設(shè)計(jì)、景洪網(wǎng)站官網(wǎng)定制、小程序定制開(kāi)發(fā)服務(wù),打造景洪網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供景洪網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(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ā)文檔中如下提到

怎么在微信小程序中實(shí)現(xiàn)一個(gè)websocket聊天室

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

var fs = require('fs');
const options = {
  key: fs.readFileSync('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 'utf8'),//證書地址
  cert: fs.readFileSync('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 'utf8'),//證書地址
};
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)
  }
}

以上就是怎么在微信小程序中實(shí)現(xiàn)一個(gè)websocket聊天室,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見(jiàn)到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

文章題目:怎么在微信小程序中實(shí)現(xiàn)一個(gè)websocket聊天室
URL地址:http://muchs.cn/article12/ishjgc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動(dòng)網(wǎng)站建設(shè)、標(biāo)簽優(yōu)化、商城網(wǎng)站、關(guān)鍵詞優(yōu)化、網(wǎng)站收錄、虛擬主機(jī)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名