微信小程序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 IE和FF兼容性问题汇总
Feb 09 Javascript
Jquery 实现Tab效果 思路是js思路
Mar 02 Javascript
idTabs基于JQuery的根据URL参数选择Tab插件
Apr 11 Javascript
用JavaScript实现类似于ListBox功能示例代码
Mar 09 Javascript
Javascript基础教程之数组 array
Jan 18 Javascript
Javascript 6里的4个新语法
Aug 25 Javascript
JS实现的相册图片左右滚动完整实例
Nov 23 Javascript
jQuery中弹出iframe内嵌页面元素到父页面并全屏化的实例代码
Dec 27 Javascript
jQuery EasyUI Layout实现tabs标签的实例
Sep 26 jQuery
vue 使用post/get 下载导出文件操作
Aug 07 Javascript
Vuejs通过拖动改变元素宽度实现自适应
Sep 02 Javascript
js+html+css实现手动轮播和自动轮播
Dec 30 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
smtp邮件发送一例
2006/10/09 PHP
php 使用GD库为页面增加水印示例代码
2014/03/24 PHP
PHP生成json和xml类型接口数据格式
2015/05/17 PHP
你不知道的文件上传漏洞php代码分析
2016/09/29 PHP
php实现往pdf中加数字签名操作示例【附源码下载】
2018/08/07 PHP
PHP利用pdo_odbc实现连接数据库示例【基于ThinkPHP5.1搭建的项目】
2019/05/13 PHP
javascript中字符串替换函数replace()方法与c# 、vb 替换有一点不同
2010/06/25 Javascript
Prototype源码浅析 Number部分
2012/01/16 Javascript
通过遮罩层实现浮层DIV登录的js代码
2014/02/07 Javascript
Jquery利用mouseenter和mouseleave实现鼠标经过弹出层且可以点击
2014/02/12 Javascript
JS实现点击按钮后框架内载入不同网页的方法
2015/05/05 Javascript
原生JS和JQuery动态添加、删除表格行的方法
2015/05/28 Javascript
js数组去重的5种算法实现
2015/11/04 Javascript
JS实现json的序列化和反序列化功能示例
2017/06/13 Javascript
vue实现单选和多选功能
2017/08/11 Javascript
element 结合vue 在表单验证时有值却提示错误的解决办法
2018/01/22 Javascript
vue: WebStorm设置快速编译运行的方法
2018/10/18 Javascript
JS计算两个数组的交集、差集、并集、补集(多种实现方式)
2019/05/21 Javascript
[00:35]TI7不朽珍藏III——寒冰飞龙不朽展示
2017/07/15 DOTA
[00:43]拉比克至宝魔导师密钥展示
2018/12/20 DOTA
Python通过90行代码搭建一个音乐搜索工具
2015/07/29 Python
python将每个单词按空格分开并保存到文件中
2018/03/19 Python
Python基于递归和非递归算法求两个数最大公约数、最小公倍数示例
2018/05/21 Python
python实现数字炸弹游戏
2020/07/17 Python
4款Python 类型检查工具,你选择哪个呢?
2020/10/30 Python
HTML5计时器小例子
2013/10/15 HTML / CSS
用HTML5制作视频拼图的教程
2015/05/13 HTML / CSS
德国户外装备、登山运动和攀岩商店:tapir store
2020/02/12 全球购物
SQL面试题
2013/12/09 面试题
AJAX都有哪些有点和缺点
2012/11/03 面试题
文秘档案管理岗位职责
2014/03/06 职场文书
ktv好的活动方案
2014/08/15 职场文书
关于远足的感想
2015/08/10 职场文书
创业计划书之个人工作室
2019/08/22 职场文书
创业开店,这样方式更合理
2019/08/26 职场文书
Nginx 502 Bad Gateway错误原因及解决方案
2021/03/31 Servers