内容简介:最近做了一个微信小程序的即时通讯功能,之前我也做过node.js的websocket服务,不过是在web端应用的socket.io服务。小程序本身对http、websocket等连接均有诸多限制,所以这次项目选择了node.js自带的ws模块。初始化一个node.js项目,引入ws模块创建websocket实例,并设置监听端口
最近做了一个微信小程序的即时通讯功能,之前我也做过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) } } 复制代码
到这里,一个简单的聊天室服务端配置就基本完成了。
具体的代码细节,请观众老爷们移步 微信小程序中聊天室的服务端和客户端配置示例 ^.^
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- h5聊天室模板|仿微信聊天室html5
- Netty网络聊天(一) 聊天室的实战(最易懂)
- 基于Flutter+Dart聊天实例|flutter仿微信界面聊天室
- 实战swoole【聊天室】
- 如何快速实现一个聊天室?
- 搭建Websocket简易聊天室
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
微信营销与运营一册通
何秀芳、葛存山 / 人民邮电出版社 / 2014-10
《微信营销与运营一册通》深入介绍了当今最为火热的话题——微信营销,内容全面、系统和深入。它基于微信的最新版本,从策略、技巧与案例等多角度详细解析了微信的营销与运营,所有内容都是行业经验的结晶,旨在为企业或个人运用微信提供有价值的参考。《微信营销与运营一册通》主要内容如下。 * 5大微信营销利器:书中介绍了5大微信营销利器,包括漂流瓶、二维码、LBS功能、朋友圈和公众平台等。 * 6大微......一起来看看 《微信营销与运营一册通》 这本书的介绍吧!
html转js在线工具
html转js在线工具
正则表达式在线测试
正则表达式在线测试