微信小程序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 相关文章推荐
16个最流行的JavaScript框架[推荐]
May 29 Javascript
JavaScript call apply使用 JavaScript对象的方法绑定到DOM事件后this指向问题
Sep 28 Javascript
JavaScript中“基本类型”之争小结
Jan 03 Javascript
cookie中的path与domain属性详解
Dec 18 Javascript
JS根据变量保存方法名并执行方法示例
Apr 04 Javascript
JavaScript实现在页面间传值的方法
Apr 07 Javascript
jquery动感漂浮导航菜单代码分享
Apr 15 Javascript
基于JS实现翻书效果的页面切换样式
Feb 16 Javascript
基于Node.js实现压缩和解压缩的方法
Feb 13 Javascript
微信小程序调用微信支付接口的实现方法
Apr 29 Javascript
JavaScript使用canvas绘制随机验证码
Feb 17 Javascript
JavaScript构造函数原理及实现流程解析
Nov 19 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入门速成教程
2007/03/19 PHP
无需重新编译php加入ftp扩展的解决方法
2013/02/07 PHP
mac下Apache + MySql + PHP搭建网站开发环境
2014/06/02 PHP
JS实现金额转换(将输入的阿拉伯数字)转换成中文的实现代码
2013/09/30 Javascript
php跨域调用json的例子
2013/11/13 Javascript
javascript使用smipleChart实现简单图表
2015/01/02 Javascript
js实现仿Discuz文本框弹出层效果
2015/08/13 Javascript
AngularJS入门教程引导程序
2016/08/18 Javascript
easyui combobox开启搜索自动完成功能的实例代码
2016/11/08 Javascript
浅谈Vue SSR 的 Cookies 问题
2017/11/20 Javascript
vue中的计算属性的使用和vue实例的方法示例
2017/12/04 Javascript
JavaScript实现区块链
2018/03/14 Javascript
echarts鼠标覆盖高亮显示节点及关系名称详解
2018/03/17 Javascript
vue 实现边输入边搜索功能的实例讲解
2018/09/16 Javascript
JS无限级导航菜单实现方法
2019/01/05 Javascript
js中innerText/textContent和innerHTML与target和currentTarget的区别
2019/01/21 Javascript
Vue 实现CLI 3.0 + momentjs + lodash打包时优化
2019/11/13 Javascript
通过js随机函数Math.random实现乱序
2020/05/19 Javascript
jdk1.8+vue elementui实现多级菜单功能
2020/09/24 Javascript
Python输出汉字字库及将文字转换为图片的方法
2016/06/04 Python
Django中的forms组件实例详解
2018/11/08 Python
python获取中文字符串长度的方法
2018/11/14 Python
对python过滤器和lambda函数的用法详解
2019/01/21 Python
python 实现图片旋转 上下左右 180度旋转的示例
2019/01/24 Python
Python将主机名转换为IP地址的方法
2019/08/14 Python
pandas apply多线程实现代码
2020/08/17 Python
CSS3,线性渐变(linear-gradient)的使用总结
2017/01/09 HTML / CSS
servlet面试题
2012/08/20 面试题
地理科学专业毕业生求职信
2013/10/15 职场文书
社区八一活动方案
2014/02/03 职场文书
演讲比赛的活动方案
2014/08/28 职场文书
呐喊读书笔记
2015/06/30 职场文书
环境保护宣传标语大全!
2019/06/28 职场文书
vue实现锚点定位功能
2021/06/29 Vue.js
JavaScript 对象创建的3种方法
2021/11/17 Javascript
最新动漫情报:2022年7月新番定档超过30部, OVERLORD骨王第四季也在其中噢
2022/05/04 日漫