博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
实时开发框架Meteor API解读系列<四>Server connections
阅读量:2201 次
发布时间:2019-05-03

本文共 4831 字,大约阅读时间需要 16 分钟。

写在前面的话

  1. 该篇博客主要讲Server connections
  2. 基于0.8.0版本
  3. 本篇博客在ubuntu系统下操作。
  4. 博客地址: 转载请注明出处
  5. 如有可能请阅读官方文档。博客内有错误遗漏之处望谅解和指出。谢谢

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:

  API-004  {
{> hello}}

启动应用并打开浏览器 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

  API-004  {
{> hello}}

自己尝试断开服务器和重链接效果。

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);

代码下载地址: 
或者关注我的github项目Lesson(博客原文和代码 位于Meteor目录内): 
github.com/huyinghuan/Lesson

转载请注明出处谢谢!

你可能感兴趣的文章
(PAT 1040) Longest Symmetric String (DP-最长回文子串)
查看>>
(PAT 1145) Hashing - Average Search Time (哈希表冲突处理)
查看>>
(1129) Recommendation System 排序
查看>>
PAT1090 Highest Price in Supply Chain 树DFS
查看>>
(PAT 1096) Consecutive Factors (质因子分解)
查看>>
(PAT 1019) General Palindromic Number (进制转换)
查看>>
(PAT 1073) Scientific Notation (字符串模拟题)
查看>>
(PAT 1080) Graduate Admission (排序)
查看>>
Play on Words UVA - 10129 (欧拉路径)
查看>>
mininet+floodlight搭建sdn环境并创建简答topo
查看>>
【linux】nohup和&的作用
查看>>
Set、WeakSet、Map以及WeakMap结构基本知识点
查看>>
【NLP学习笔记】(一)Gensim基本使用方法
查看>>
【NLP学习笔记】(二)gensim使用之Topics and Transformations
查看>>
【深度学习】LSTM的架构及公式
查看>>
【python】re模块常用方法
查看>>
剑指offer 19.二叉树的镜像
查看>>
剑指offer 20.顺时针打印矩阵
查看>>
剑指offer 21.包含min函数的栈
查看>>
剑指offer 23.从上往下打印二叉树
查看>>