tinyDDP连接是一种连接协议,创建连接要提供ip和port。
因为可以与多个仪器去进行连接,怎么管理多种连接。此文主要学习这种管理连接的模式,而不是ddp连接的细节。
1、client端发起连接
使用ip和port拼接一个url字符串,meteor.call方法调用server端的对应方法
let url = "http://" + this.ip + ":" + this.port + "/";
let res = await CommonMethods.meteorCall("connectDDP", url);
2、DDPManager类
server端,创建一个DDPManager实例。
DDPManager用来存储、管理DDPConnect 实例
import { DDPManager } from './DDPManager';
const _DDPManager = new DDPManager()
DDPManager类
getDDP方法,根据url去获取DDPConnect实例,如果没有就新建一个。这是一种常用并且很巧妙的模式,值得借鉴。
import { DDPConnect } from './DDPConnect';
export class DDPManager
{
constructor()
{
this._DDPList = []
}
getDDP (url, eventHandle) {
let ddpObj = this._DDPList.find(item => item.url === url)
if (ddpObj === undefined) {
ddpObj = {
ddp: null,
url: url
}
this._DDPList.push(ddpObj)
ddpObj.ddp = new DDPConnect(url, eventHandle)
}
return ddpObj.ddp
}
}
3、DDPConnect 类
DDPConnect实例是用来创建ddp连接的,里面包含创建连接的connect方法,发送命令的call方法等等;
4、被前端调用的connectDDP方法
- 先根据url从_DDPManager中获取到DDPConnect实例
- 查询DDPConnect实例的连接状态
- 如果连接状态是connected、connecting、connecting、waiting,就调用disconnect方法断开先
- 断开后再连接,并返回连接的结果
Meteor.methods({
async connectDDP(url){
let conn = _DDPManager.getDDP(url);
let staus = conn.status();
if (staus.status == 'connected' || staus.status == 'connecting' || staus.status == "offline" ||staus.status == 'waiting') {
console.log('kisll')
conn.disconnect()
}
return await conn.connect();
},
})