写在前面的话
- 该篇博客主要讲Server connections
- 基于0.8.0版本
- 本篇博客在ubuntu系统下操作。
- 博客地址:http://blog.csdn.net/a6383277/article/details/23100421 转载请注明出处
- 如有可能请阅读官方文档。博客内有错误遗漏之处望谅解和指出。谢谢
Server connections
这里的API主要是管理服务端和客户端间通信。
Meteor.status() Client
这个函数主要是获取当前的连接状态。 在Client端使用。它的返回结果是一个Object对象。它是一个活性数据源。先看代码:
meteor create API-004 #创建工程
cd API-004
mkdir client #创建文件夹
mv API-004.js client/ #移动文件
mv API-004.html client/ #移动文件
rm *.css #移除文件
client/API-004.js:
Template.hello.greeting = function () {
return EJSON.stringify(Meteor.status());
};
client/API-004.html:
<head>
<title>API-004</title>
</head>
<body>
{{> hello}}
</body>
<template name="hello">
<h1>Hello World!</h1>
{{greeting}}
</template>
启动应用并打开浏览器 localhost:3000查看结果
{"status":"connected","connected":true,"retryCount":0}
这个是连接状态的对象,现在保持浏览器打开状态,后用Ctrl+C结束应用,在看页面的变化,类似这样的结果(可以看到浏览器在不断的刷新,页面数据不断的改变):
{"status":"waiting","connected":false,"retryCount":2,"retryTime":1396850850849.2966}
在重新启动应用,稍等一会后可以看到结果:(ps:因为当连接中断后,meteor不是以固定的频率去重新尝试链接后台,而是一个递增的时间去尝试,如第一次可能只有1秒,没有连接上就会等3秒在去尝试连接,如果还没连接上就会等6秒,越往后去尝试连接的频率越低)
{"status":"connected","connected":true,"retryCount":0}
可以看到这个对象主要的属性有
connected 类型:Boolean
如果当前是与服务器已经连接上了的话为true。否则为false。如果没有链接上,即值为false时,这个方法会一直调用直到链接上。
status 类型 string
这个属性描述的是当前的连接状态,可能的值是 “connected”(已经连接上了),”connecting”(没有连接上服务器,正在尝试打开新的连接),”failed”(连接失败。例如客户端和服务端的DDP版本不同,导致无法解析数据,连接失败),”waiting”(连接失败,等待重新尝试链接),”offline”(用户处于离线状态)
retryCount 类型 Number
当失去连接后客户端已经尝试连接的次数。当连接上时,这个值为0
retryTime 类型 Number 或者 undefined
下次才是连接的时间点,单位毫秒。这个属性只有当status为”waiting”时才有。通过这个可以知道下次尝试链接的时间是多少如:
new Date(retryTime)
或者还要等待多少秒才会连接:
(retryTime - (new Date()).getTime())/1000
看下代码:
修改client/API-004.js:
Template.hello.greeting = function () {
return EJSON.stringify(Meteor.status());
};
Template.hello.time = function () {
var status = Meteor.status();
var retryTime = status.retryTime;
if(!retryTime){
return {}
}
var date = (new Date(retryTime)).toString();
var second = Math.floor(retryTime - (new Date()).getTime()) / 1000;
return {
date:date,
second:second
}
};
修改client/API-004.html
<head>
<title>API-004</title>
</head>
<body>
{{> hello}}
</body>
<template name="hello">
<h1>Hello World!</h1>
{{greeting}}
<br>
<br>
<br>
{{#with time}}
下次尝试连接的时间是:{{date}}<br>
下次尝试链接等待的秒数是:{{second}}
{{/with}}
</template>
自己尝试断开服务器和重链接效果。
reason 类型 String 或者 undefined
当status的值是”failed”时,它会给出连接失败的原因。现在我暂时没办法把这个字段暂时出来,如果你有处理方法可以让它显示出来,请在博客下留言。
因为 Meteor.status()是一个活性数据源,所以你可以把数据绑定到Template上面去,当它值改变时 就可以马上反应到界面上去。在需要当客户端与服务器断开时,可以利用这个函数来提醒用户。
Meteor.reconnect() Client调用
上面已经说过了,当没有连接上时,客户端会每隔一段时间自动连接服务器。如果你想强制尝试连接的话就可以调用这个方法。当处于链接状态时,这个方法不会做任何事情。
你可以这样来测试这个方法。把服务端关闭,在浏览器控制台输入Meteor.reconnect(),会看到界面上的retryTime等属性值会马上变化。这就是强制刷新与服务端的连接了。
Meteor.disconnect() Client调用
既然有了强制连接服务端而不是让自动去尝试连接,那么也自然后强制断开服务器的连接了。这个函数就是强制断开与服务器的连接。调用这个方法后,会停止所以活性数据的更新。客户端也不会接收任何更新数据了。当后台代码改变时,页面也不会有任何变化,代码热部署的影响也就被禁了。当前每隔一段时间自动尝试连接服务器的功能也会被禁止。这是status的状态是offline
。可以通过Meteor.reconnect
来回复连接状态。当实时数据变化不是一定需要时,这可以为移动设备保持电量。如果长期不断的更新数据会带来电量消耗。也可以自己在控制台尝试一下,看看实际效果如何。
Meteor.onConnection(callback) Server端调用
当有一个新的客户连接到服务器时,调用该函数注册的回调函数(类似一个连接监听器)
这个函数有一个返回值,是一个带有stop函数的对象。当调用了stop函数后,里面的回调函数就会停止,当新的连接来时不会在执行。
回调函数接收一个对象参数,我们通过代码来看看实际效果。
在应用根目录下创建一个server文件夹,新建一个js文件server.js
代码如下:
server.js:
var conn = Meteor.onConnection(function(connection){
/*
lbacks will be called again, and the new connection will have a new connection id.
官方文档提到了。当一个客户端重新链接到服务器时,它会重新分配一个uuid.这里包括了断线重连,页面刷新等。
在后面的版本中将改变这个策略,客户端重新连接的话会保持这个id标志符不变。当前这个回调函数也不会在执行。只有当是一个全新的连接时,才会执行它。
*/
var uuid = connection.id; //连接的uuid 每个连接都有一个自己的uuid 类似java里面的sid.
console.log("当前这个连接的uuid 是:" +uuid);
//connection.close() //关闭这个连接 通过调用它也会关闭这个链接
//通过定时器来模拟某种需要关闭的情况。如:ip来源不合法等。当然客户端的还是会进行尝试连接到此。
//可以看到10秒后,页面将会改变
var closeTest = function(){
connection.close();
}
//这个Meteor.setTimeout 类似于原生js的setTimeout,不过原生的setTimeout可能会出现预料之外的结果,因此推荐Meteor封装后的。
Meteor.setTimeout(closeTest,10000);
//当连接断开后会执行里面的回调函数,如果连接已经处理关闭状态,那么这个回调函数会立即执行。
//包括在客户端断网,刷新页面等情况或者调用Meteor.disconnect()等方法都会触发这个回调函数函数。
connection.onClose(function(){
console.log("连接已关闭")
});
//客户端ip地址,可以利用这个东西来拒绝一些访问请求。根据实际情况灵活应用吧。
/** 注意:下面这段话翻译自文档。我没有亲自实验过。请各位自行验证。如有翻译不正确的地方,可以在我博客下方留言,我会改正。
如果你的meteor工程在另外一个代理后(例如挂在了nginx后面),为了正确的获取到客户端的ip地址 你需要设置环境变量HTTP_FORWARDED_COUNT
设置 HTTP_FORWARDED_COUNT为一个整数来表示前面经过了几层代理 .例如代理只有一层时,你应该设置它的值为1.
*/
var clientAddress = connection.clientAddress;
console.log("客户端ip是:"+clientAddress);
//这个是http头信息,不包括Cookie
var httpHeaders = connection.httpHeaders;
console.log("http头是:"+EJSON.stringify(httpHeaders));
});
//当调用conn.stop()后, 上面onConnection里面的回调函数都不会执行了。
//下面通过一个定时器来模拟某种需要关闭的情况
function abc(){
conn.stop();
}
//10秒后停止监听。在期间我们不断刷新页面来看打印效果,10秒再刷新页面就不会出现打印了。
//可以取消下面的这行注释看效果
//Meteor.setTimeout(abc,10000);
代码下载地址:http://download.csdn.net/detail/a6383277/7156971
或者关注我的github项目Lesson(博客原文和代码 位于Meteor目录内):
github.com/huyinghuan/Lesson
转载请注明出处谢谢!