微信小程序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 相关文章推荐
JQuery入门——移除绑定事件unbind方法概述及应用
Feb 05 Javascript
jQuery实现购物车多物品数量的加减+总价计算
Jun 06 Javascript
jQuery中bind()方法用法实例
Jan 19 Javascript
JS实现弹出浮动窗口(支持鼠标拖动和关闭)实例详解
Aug 06 Javascript
JavaScript组合模式学习要点
Aug 26 Javascript
AngularJS全局scope与Isolate scope通信用法示例
Nov 22 Javascript
利用node.js本地搭建HTTP服务器
Apr 19 Javascript
解决vue2.x中数据渲染以及vuex缓存的问题
Jul 13 Javascript
React-Native左右联动List的示例代码
Sep 21 Javascript
vue mint-ui 实现省市区街道4级联动示例(仿淘宝京东收货地址4级联动)
Oct 16 Javascript
详解React项目的服务端渲染改造(koa2+webpack3.11)
Mar 19 Javascript
vue实现同一个页面可以有多个router-view的方法
Sep 20 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 字符串压缩方法比较示例
2014/01/23 PHP
Win7 64位系统下PHP连接Oracle数据库
2014/08/20 PHP
ThinkPHP框架实现数据增删改
2017/05/07 PHP
javascript之解决IE下不渲染的bug
2007/06/29 Javascript
flash javascript之间的通讯方法小结
2008/12/20 Javascript
javascript instanceof 与typeof使用说明
2010/01/11 Javascript
Jquery ajax传递复杂参数给WebService的实现代码
2011/08/08 Javascript
js将控件隐藏的方法及display属性介绍
2013/07/04 Javascript
js获取url中指定参数值的示例代码
2013/12/14 Javascript
connect中间件session、cookie的使用方法分享
2014/06/17 Javascript
全面解析Bootstrap中scrollspy(滚动监听)的使用方法
2016/06/06 Javascript
值得分享的Bootstrap Table使用教程
2016/11/23 Javascript
Javascript实现倒计时时差效果
2017/05/18 Javascript
w3c编程挑战_初级脚本算法实战篇
2017/06/23 Javascript
Vue2.X和Vue3.0数据响应原理变化的区别
2019/11/07 Javascript
小程序实现按下录音松开识别语音
2019/11/22 Javascript
如何利用node.js开发一个生成逐帧动画的小工具
2019/12/01 Javascript
Python的字典和列表的使用中一些需要注意的地方
2015/04/24 Python
Python的collections模块中namedtuple结构使用示例
2016/07/07 Python
python3.x 将byte转成字符串的方法
2018/07/17 Python
pycharm中成功运行图片的配置教程
2018/10/28 Python
NumPy 基本切片和索引的具体使用方法
2019/04/24 Python
python如何实现从视频中提取每秒图片
2020/10/22 Python
Keras Convolution1D与Convolution2D区别说明
2020/05/22 Python
如何向scrapy中的spider传递参数的几种方法
2020/11/18 Python
css3实现波纹特效、H5实现动态波浪效果
2018/01/31 HTML / CSS
VICHY薇姿英国官网:全球专业敏感肌护肤领先品牌
2017/07/04 全球购物
阿玛尼美妆加拿大官方商城:Giorgio Armani Beauty加拿大
2017/10/24 全球购物
Ruby中的保护方法和私有方法与一般面向对象程序设计语言的一样吗
2013/05/01 面试题
环保建议书100字
2014/05/14 职场文书
机电专业求职信
2014/06/14 职场文书
党员批评与自我批评发言稿
2014/10/14 职场文书
小学优秀教师事迹材料
2014/12/16 职场文书
物业保安辞职信
2015/05/12 职场文书
民事答辩状格式范文
2015/05/21 职场文书
2015年城管执法工作总结
2015/07/23 职场文书