微信小程序websocket聊天室的实现示例代码

 更新时间:2019年02月12日 14:30:43   作者:極楽  
这篇文章主要介绍了微信小程序websocket聊天室的实现示例代码,小程序本身对http、websocket等连接均有诸多限制,所以这次项目选择了node.js自带的ws模块。感兴趣的可以参考一下

背景

最近做了一个微信小程序的即时通讯功能,之前我也做过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服务就配置完成了。当然,问题远远不止这么简单。要想在小程序中进行通信,还需要解决下面几个问题。

域名

关于小程序服务端域名配置,小程序开发文档中如下提到

小程序请求地址只支持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)
  }
}

到这里,一个简单的聊天室服务端配置就基本完成了。

最终作品效果如下:

部分代码细节,请观众老爷们移步 微信小程序中聊天室的服务端和客户端配置示例 ^.^

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 关于uniapp微信小程序左上角返回按钮的监听详解

    关于uniapp微信小程序左上角返回按钮的监听详解

    uniapp是一个支持多端的技术,因此它是兼容性比较强的,而且速度也很快,下面这篇文章主要给大家介绍了关于uniapp微信小程序左上角返回按钮监听的相关资料,需要的朋友可以参考下
    2022-04-04
  • 微信小程序npm引入vant-weapp的踩坑记录

    微信小程序npm引入vant-weapp的踩坑记录

    这篇文章主要给大家介绍了关于微信小程序npm引入vant-weapp的踩坑记录,文中通过示例代码介绍的非常详细,对大家学习或者使用微信小程序具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08
  • js判断undefined类型示例代码

    js判断undefined类型示例代码

    这篇文章主要介绍了js判断undefined类型的实现方法,需要的朋友可以参考下
    2014-02-02
  • [HTML/CSS/Javascript]WWTJS

    [HTML/CSS/Javascript]WWTJS

    [HTML/CSS/Javascript]WWTJS...
    2007-09-09
  • js定义类的方法示例【ES5与ES6】

    js定义类的方法示例【ES5与ES6】

    这篇文章主要介绍了js定义类的方法,结合实例形式分析了javascript ES5与ES6标准下类的定义方法,需要的朋友可以参考下
    2019-07-07
  • 带你搞懂js的深拷贝

    带你搞懂js的深拷贝

    这篇文章主要为大家介绍了js的深拷贝,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-11-11
  • 正则表达式在js前端的15个使用场景梳理总结

    正则表达式在js前端的15个使用场景梳理总结

    本篇带来15个正则使用场景,按需索取,收藏恒等于学会!!有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • 原生js实现随机点餐效果

    原生js实现随机点餐效果

    一款十分简单的原生js实现的随机点菜代码,点击点菜按钮随机点取上面菜单的菜品,可根据需求改成自己需要功能,比如说随机点名。感兴趣的朋友来参考实现代码吧
    2019-12-12
  • JS错误处理与调试操作实例分析

    JS错误处理与调试操作实例分析

    这篇文章主要介绍了JS错误处理与调试操作,结合实例形式分析了JavaScript错误捕获、处理、调试工具、断点调试等相关操作技巧,需要的朋友可以参考下
    2020-04-04
  • JS实现刷新父页面不弹出提示框的方法

    JS实现刷新父页面不弹出提示框的方法

    这篇文章主要介绍了JS实现刷新父页面不弹出提示框的方法,实例分析了javascript子窗口的打开以及子窗口与父窗口的交互操作技巧,需要的朋友可以参考下
    2016-06-06

最新评论