您的位置:首页 > 其它

实时开发框架Meteor API解读系列<四>Server connections

2014-04-07 16:09 615 查看


写在前面的话

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


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
转载请注明出处谢谢!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: