微信小程序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 相关文章推荐
当自定义数据属性为json格式字符串时jQuery的data api问题探讨
Feb 18 Javascript
巧用js提交表单轻松解决一个页面有多个提交按钮
Nov 17 Javascript
使用POST方式弹出窗口的两种方法示例介绍
Jan 29 Javascript
JavaScript数组前面插入元素的方法
Apr 06 Javascript
jQuery中$this和$(this)的区别介绍(一看就懂)
Jul 06 Javascript
基于jquery实现瀑布流布局
Jun 28 Javascript
jQuery 的 ready()的纯js替代方法
Nov 20 Javascript
超全面的JavaScript开发规范(推荐)
Jan 21 Javascript
通过fastclick源码分析彻底解决tap“点透”
Dec 24 Javascript
vue-router history模式下的微信分享小结
Jul 05 Javascript
微信小程序实现动态获取元素宽高的方法分析
Dec 10 Javascript
node.js域名解析实现方法详解
Nov 05 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二分法在IP地址查询中的应用
2008/08/12 PHP
解析使用ThinkPHP应该掌握的调试手段
2013/06/20 PHP
Fatal error: session_start(): Failed to initialize storage module: files问题解决方法
2014/05/04 PHP
PHP实现导出excel数据的类库用法示例
2016/10/15 PHP
showModalDialog 和 showModelessDialog
2007/01/22 Javascript
基于Jquery的动态创建DOM元素的代码
2010/12/28 Javascript
基于jQuery选择器的整理集合
2013/04/26 Javascript
如何实现textarea里的不同文本显示不同颜色
2014/01/20 Javascript
jQuery实现移动 和 渐变特效的点击事件
2015/02/26 Javascript
js实现有时间限制消失的图片方法
2015/02/27 Javascript
JavaScript时间转换处理函数
2015/04/14 Javascript
AngularJS学习笔记之依赖注入详解
2016/05/16 Javascript
javascript添加前置0(补零)的几种方法
2017/01/05 Javascript
vue bootstrap小例子一枚
2017/06/09 Javascript
使用webpack打包koa2 框架app
2018/02/02 Javascript
JavaScript实现创建自定义对象的常用方式总结
2018/07/09 Javascript
使用JS判断页面是首次被加载还是刷新
2019/05/26 Javascript
node.js express框架实现文件上传与下载功能实例详解
2019/10/15 Javascript
微信小程序使用自定义组件导航实现当前页面高亮
2020/01/02 Javascript
JavaScript cookie原理及使用实例
2020/05/08 Javascript
JavaScript组合模式---引入案例分析
2020/05/23 Javascript
Python学习之asyncore模块用法实例教程
2014/09/29 Python
如何使用七牛Python SDK写一个同步脚本及使用教程
2015/08/23 Python
Python 模拟登陆的两种实现方法
2017/08/10 Python
Python2和Python3中print的用法示例总结
2017/10/25 Python
解决pandas read_csv 读取中文列标题文件报错的问题
2018/06/15 Python
python 保存float类型的小数的位数方法
2018/10/17 Python
浅谈Python 列表字典赋值的陷阱
2019/01/20 Python
Python 实现毫秒级淘宝抢购脚本的示例代码
2019/09/16 Python
在python中利用try..except来代替if..else的用法
2019/12/19 Python
解决HTML5中滚动到底部的事件问题
2019/08/22 HTML / CSS
红旗团支部事迹材料
2014/01/27 职场文书
学校施工安全责任书
2015/01/29 职场文书
停电调休通知
2015/04/16 职场文书
React实现动效弹窗组件
2021/06/21 Javascript
gateway与spring-boot-starter-web冲突问题的解决
2021/07/16 Java/Android