安基網 首頁 腳本 JavaScript 查看內容

微信小程序websocket聊天室

2019-2-18 01:29| 投稿: xiaotiger |來自: 互聯網


免責聲明:本站系公益性非盈利IT技術普及網,本文由投稿者轉載自互聯網的公開文章,文末均已注明出處,其內容和圖片版權歸原網站或作者所有,文中所述不代表本站觀點,若有無意侵權或轉載不當之處請從網站右下角聯系我們處理,謝謝合作!

摘要: 最近做了一個微信小程序的即時通訊功能,之前我也做過node.js的websocket服務,不過是在web端應用的socket.io服務。小程序本身對http、websocket等連接均有諸多限制,所以這次項目選擇了node.js自帶的ws模塊。服務端 ...

背景

最近做了一個微信小程序的即時通訊功能,之前我也做過node.js的websocket服務,不過是在web端應用的socket.io服務。小程序本身對http、websocket等連接均有諸多限制,所以這次項目選擇了node.js自帶的ws模塊。

服務端

初始化一個node.js項目,引入ws模塊

const webSocket = require(ws);
復制代碼

創建websocket實例,并設置監聽端口

const wss = new webSocket.Server({
 port: 3001
});
復制代碼

定義wss實例方法,實現socket監聽和信息發布。下面貼上簡單的示例:

wss.on(connection, function connection(ws, req) {
 console.log(連接開啟)
 
 //發生錯誤
 ws.on(error, function error(error) {
 console.log(error, error);
 });
 //斷開連接
 ws.on(close, function close(close) {
 console.log( 已關閉);
 });
 ws.on(message, function message(message) {
 ws.send(客戶端發來了一條消息)
 });
 //發送消息
 ws.send(連接已開啟);
 ws.send(id + 已連接)
});
復制代碼

這樣,一個簡單的websocket服務就配置完成了。當然,問題遠遠不止這么簡單。要想在小程序中進行通信,還需要解決下面幾個問題。

域名

關于小程序服務端域名配置,小程序開發文檔中如下提到

小程序請求地址只支持https或者wss協議,因此首先要配置的就是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監聽的端口號需要做一下代理,因為小程序如果不配置端口號時,所有請求的url都不可以帶端口號。

多房間通信

先看一下廣播的實現:

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

wss對象的clients是一個存儲著所有socket連接對象的數組,每條連接對象都可以調用各自的send方法發送信息。

在此基礎上,我們可以進行一定的封裝,用一個唯一的標識符映射到每一條socket連接,這樣我們需要向特定的某個連接發送信息時,就可以找到該連接。

可以通過連接的url作為唯一標識:

 let sockets = {}
 wss.on(connection, function connection(ws, req) {
 let id = req.url.slice(5);//截幾位字符串根據自己實際獲得的url來看
 sockets[id] = ws;
 ws.send(id + 已連接);
 ...
復制代碼

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

在此基礎上,可以繼續封裝諸如加入房間、離開房間、房間內通信、向特定用戶私聊等功能,總體來說是對send方法的封裝。值得注意的是send方法只能發送字符串,json對象需要轉化成字符串再傳入send。

下面是一個私聊的示例:

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

到這里,一個簡單的聊天室服務端配置就基本完成了。

最終作品效果如下:

更多詳細代碼:https://github.com/lihao336991/wx-websocket

鏈接:https://juejin.im/post/5c4529576fb9a049ed312d58

來源:掘金

著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。



小編推薦:欲學習電腦技術、系統維護、網絡管理、編程開發和安全攻防等高端IT技術,請 點擊這里 注冊賬號,公開課頻道價值萬元IT培訓教程免費學,讓您少走彎路、事半功倍,好工作升職加薪!

本文出自:https://www.toutiao.com/a6658410782503469575/

免責聲明:本站系公益性非盈利IT技術普及網,本文由投稿者轉載自互聯網的公開文章,文末均已注明出處,其內容和圖片版權歸原網站或作者所有,文中所述不代表本站觀點,若有無意侵權或轉載不當之處請從網站右下角聯系我們處理,謝謝合作!


鮮花

握手

雷人

路過

雞蛋

相關閱讀

最新評論

 最新
返回頂部
洗衣店赚钱联系澳洁 北京十一选五走势图表 七乐彩百度预测 秒速时时彩在线计划 天一图库印刷区最早最齐全的 天津快乐十分彩走势图 三门峡期货配资 十二选五辽宁一定牛 吉林十一选五出的什么号 10万元存款如何理财 股票中的权重指的是什么