微信小程序websocket聊天室的实现示例代码


Posted in Javascript onFebruary 12, 2019

背景

最近做了一个微信小程序的即时通讯功能,之前我也做过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服务就配置完成了。当然,问题远远不止这么简单。要想在小程序中进行通信,还需要解决下面几个问题。

域名

关于小程序服务端域名配置,小程序开发文档中如下提到

微信小程序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)
  }
}

到这里,一个简单的聊天室服务端配置就基本完成了。

最终作品效果如下:

微信小程序websocket聊天室的实现示例代码

部分代码细节,请观众老爷们移步 微信小程序中聊天室的服务端和客户端配置示例 ^.^

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JS 日期验证正则附asp日期格式化函数
Sep 11 Javascript
从零开始学习jQuery (十) jQueryUI常用功能实战
Feb 23 Javascript
重写javascript中window.confirm的行为
Oct 21 Javascript
js的alert样式如何更改如背景颜色
Jan 22 Javascript
使用js Math.random()函数生成n到m间的随机数字
Oct 09 Javascript
javascript动态创建表格及添加数据实例详解
May 13 Javascript
vue拦截器Vue.http.interceptors.push使用详解
Apr 22 Javascript
Vue render渲染时间戳转时间,时间转时间戳及渲染进度条效果
Jul 27 Javascript
浅谈vue项目打包优化策略
Sep 29 Javascript
使用typescript构建Vue应用的实现
Aug 26 Javascript
JavaScript相等运算符的九条规则示例详解
Oct 20 Javascript
前端框架ECharts dataset对数据可视化的高级管理
Dec 24 Javascript
深入探讨JavaScript的最基本部分之执行上下文
Feb 12 #Javascript
图文详解vue框架安装步骤
Feb 12 #Javascript
详解vue组件中使用路由方法
Feb 12 #Javascript
说说Vue.js中的functional函数化组件的使用
Feb 12 #Javascript
详解Vue用cmd创建项目
Feb 12 #Javascript
谈谈JavaScript中super(props)的重要性
Feb 12 #Javascript
微信小程序实现的自定义分享功能示例
Feb 12 #Javascript
You might like
PHP实现全角字符转为半角方法汇总
2015/07/09 PHP
初识javascript 文档碎片
2010/07/13 Javascript
JavaScript高级程序设计 阅读笔记(二十) js错误处理
2012/08/14 Javascript
js导入导出excel(实例代码)
2013/11/25 Javascript
jQuery支持动态参数将函数绑定到事件上的方法
2015/03/17 Javascript
React-Native实现ListView组件之上拉刷新实例(iOS和Android通用)
2017/07/11 Javascript
VUE2.0+ElementUI2.0表格el-table实现表头扩展el-tooltip
2018/11/30 Javascript
性能优化篇之Webpack构建速度优化的建议
2019/04/03 Javascript
解决vuex刷新状态初始化的方法实现
2019/08/15 Javascript
layui 实现加载动画以及非真实加载进度的方法
2019/09/23 Javascript
JS写滑稽笑脸运动效果
2020/05/28 Javascript
js实现翻牌小游戏
2020/07/31 Javascript
[05:05]DOTA2亚洲邀请赛 战队出场仪式
2015/02/07 DOTA
Python处理文本文件中控制字符的方法
2017/02/07 Python
Python Socket实现简单TCP Server/client功能示例
2017/08/05 Python
Python数据结构与算法之链表定义与用法实例详解【单链表、循环链表】
2017/09/28 Python
python模仿网页版微信发送消息功能
2018/02/24 Python
Python实现的线性回归算法示例【附csv文件下载】
2018/12/29 Python
python GUI实现小球满屏乱跑效果
2019/05/09 Python
python opencv minAreaRect 生成最小外接矩形的方法
2019/07/01 Python
Pandas中resample方法详解
2019/07/02 Python
Django 后台获取文件列表 InMemoryUploadedFile的例子
2019/08/07 Python
python基于plotly实现画饼状图代码实例
2019/12/16 Python
Python装饰器用法与知识点小结
2020/03/09 Python
Python气泡提示与标签的实现
2020/04/01 Python
关于python 的legend图例,参数使用说明
2020/04/17 Python
日本面向世界,国际级的免税在线购物商城:DOKODEMO
2017/02/01 全球购物
专注澳大利亚特产和新西兰特产的澳洲中文网:0061澳洲制造
2019/03/24 全球购物
优秀党员转正的自我评价
2013/10/06 职场文书
学生自我鉴定
2013/12/18 职场文书
最新奶茶店创业计划书范文
2014/02/08 职场文书
战马观后感
2015/06/08 职场文书
未婚证明范本
2015/06/15 职场文书
堂吉诃德读书笔记
2015/06/30 职场文书
英语投诉信范文
2015/07/03 职场文书
python tkinter模块的简单使用
2021/04/07 Python