微信小程序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注意img图片的onerror事件的分析
Jan 01 Javascript
JS截取字符串常用方法整理及使用示例
Oct 18 Javascript
JS可以控制样式的名称写法一览
Jan 16 Javascript
jQuery Mobile 触摸事件实例
Jun 04 Javascript
JavaScript结合Bootstrap仿微信后台多图文界面管理
Jul 22 Javascript
Bootstrap Table使用方法详解
Aug 01 Javascript
前端面试题及答案整理(二)
Aug 26 Javascript
Node.JS中事件轮询(Event Loop)的解析
Feb 25 Javascript
详解JS转换数值函数Number()、parseInt()、parseFloat()
Aug 24 Javascript
JS代码检查工具ESLint介绍与使用方法
Feb 04 Javascript
js实现数字跳动到指定数字
Aug 25 Javascript
vue 自定义组件添加原生事件
Apr 21 Vue.js
深入探讨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源码加密 仿微盾PHP加密专家(PHPCodeLock)
2010/05/06 PHP
yii操作cookie实例简介
2014/07/09 PHP
php判断当前用户已在别处登录的方法
2015/01/06 PHP
php生成唯一的订单函数分享
2015/02/02 PHP
PHP常用的排序和查找算法
2015/08/06 PHP
抛弃 PHP 代价太高
2016/04/26 PHP
php实现对短信验证码发送次数的限制实例讲解
2021/03/04 PHP
用JQuery在网页中实现分隔条功能的代码
2012/08/09 Javascript
JavaScript 变量、作用域及内存
2015/04/08 Javascript
浅谈javascript中的闭包
2015/05/13 Javascript
js实现浮动在网页右侧的简洁QQ在线客服代码
2015/09/04 Javascript
Vue获取DOM元素样式和样式更改示例
2017/03/07 Javascript
原生JavaScript实现的简单省市县三级联动功能示例
2017/05/27 Javascript
DataTables添加额外的查询参数和删除columns等无用参数实例
2017/07/04 Javascript
angular.extend方法的具体使用
2017/09/14 Javascript
JS原型继承四步曲及原型继承图一览
2017/11/28 Javascript
使用jQuery 操作table 完成单元格合并的实例
2017/12/27 jQuery
OpenLayers加载缩放控件使用方法详解
2020/09/25 Javascript
浅谈Python实现贪心算法与活动安排问题
2017/12/19 Python
python实现自动发送邮件发送多人、群发、多附件的示例
2018/01/23 Python
Python中asyncio与aiohttp入门教程
2018/10/16 Python
解决pyecharts在jupyter notebook中使用报错问题
2020/04/23 Python
python修改文件内容的3种方法详解
2019/11/15 Python
python创建n行m列数组示例
2019/12/02 Python
Python 剪绳子的多种思路实现(动态规划和贪心)
2020/02/24 Python
Python 调用有道翻译接口实现翻译
2020/03/02 Python
阿迪达斯奥地利官方商城:adidas.at
2016/10/16 全球购物
资产经营总监岗位职责范文
2013/12/01 职场文书
中学教师培训制度
2014/01/31 职场文书
学校后勤岗位职责
2014/02/19 职场文书
会计学自荐信
2014/06/03 职场文书
会议主持人开场白台词
2015/05/28 职场文书
2019自荐信该如何写呢?
2019/07/05 职场文书
用CSS3画一个爱心
2021/04/27 HTML / CSS
Python中OpenCV实现查找轮廓的实例
2021/06/08 Python
vue里使用create, mounted调用方法
2022/04/26 Vue.js