微信小程序websocket聊天室的實現(xiàn)示例代碼
背景
最近做了一個微信小程序的即時通訊功能,之前我也做過node.js的websocket服務,不過是在web端應用的socket.io服務。小程序本身對http、websocket等連接均有諸多限制,所以這次項目選擇了node.js自帶的ws模塊。
服務端
初始化一個node.js項目,引入ws模塊
const webSocket = require('ws');
創(chuàng)建websocket實例,并設置監(jiān)聽端口
const wss = new webSocket.Server({
port: 3001
});
定義wss實例方法,實現(xiàn)socket監(jiān)聽和信息發(fā)布。下面貼上簡單的示例:
wss.on('connection', function connection(ws, req) {
console.log('連接開啟')
//發(fā)生錯誤
ws.on('error', function error(error) {
console.log('error', error);
});
//斷開連接
ws.on('close', function close(close) {
console.log( '已關(guān)閉');
});
ws.on('message', function message(message) {
ws.send('客戶端發(fā)來了一條消息')
});
//發(fā)送消息
ws.send('連接已開啟');
ws.send(id + '已連接')
});
這樣,一個簡單的websocket服務就配置完成了。當然,問題遠遠不止這么簡單。要想在小程序中進行通信,還需要解決下面幾個問題。
域名
關(guān)于小程序服務端域名配置,小程序開發(fā)文檔中如下提到

小程序請求地址只支持https或者wss協(xié)議,因此首先要配置的就是SSL證書。拿到SSL證書之后,在服務端做一下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)聽的端口號需要做一下代理,因為小程序如果不配置端口號時,所有請求的url都不可以帶端口號。
多房間通信
先看一下廣播的實現(xiàn):
//廣播方法
wss.broadcast = function broadcast(data) {
wss.clients.forEach(function each(client) {
client.send(data)
});
};
wss對象的clients是一個存儲著所有socket連接對象的數(shù)組,每條連接對象都可以調(diào)用各自的send方法發(fā)送信息。
在此基礎(chǔ)上,我們可以進行一定的封裝,用一個唯一的標識符映射到每一條socket連接,這樣我們需要向特定的某個連接發(fā)送信息時,就可以找到該連接。
可以通過連接的url作為唯一標識:
let sockets = {}
wss.on('connection', function connection(ws, req) {
let id = req.url.slice(5);//截幾位字符串根據(jù)自己實際獲得的url來看
sockets[id] = ws;
ws.send(id + '已連接');
...
客戶端每次連接時url后拼接一個唯一id,在服務端獲取req.url并截取字符串拿到唯一id,并將該連接對象存儲在全局的sockets下以便需要時使用。
在此基礎(chǔ)上,可以繼續(xù)封裝諸如加入房間、離開房間、房間內(nèi)通信、向特定用戶私聊等功能,總體來說是對send方法的封裝。值得注意的是send方法只能發(fā)送字符串,json對象需要轉(zhuǎn)化成字符串再傳入send。
下面是一個私聊的示例:
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('目標信道已關(guān)閉')
}
} catch (err) {
console.log(err)
}
}
到這里,一個簡單的聊天室服務端配置就基本完成了。
最終作品效果如下:

部分代碼細節(jié),請觀眾老爺們移步 微信小程序中聊天室的服務端和客戶端配置示例 ^.^
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JS中touchstart事件與click事件沖突的解決方法
這篇文章主要給大家介紹了關(guān)于JS中touchstart事件與click事件沖突的解決方法,文中通過示例代碼將解決的方法介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。2018-03-03
微信小程序之滑動頁面隱藏和顯示組件功能的實現(xiàn)代碼
這篇文章主要介紹了微信小程序之滑動頁面隱藏和顯示組件功能,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06
JavaScript調(diào)試之console.log調(diào)試的一個小技巧分享
日常開發(fā)中經(jīng)常會需要console來查看當前對象的值。當然用debugger會更全面的查看,但是總有只喜歡用console的,比如我。下面這篇文章主要給大家分享了關(guān)于JavaScript調(diào)試之console.log調(diào)試的一個小技巧,需要的朋友可以參考借鑒,下面來一起看看吧。2017-08-08

