實時開發框架Meteor API解讀系列Server connections

寫在前面的話

  1. 該篇博客主要講Server connections
  2. 基於0.8.0版本
  3. 本篇博客在ubuntu系統下操作。
  4. 博客地址:http://blog.csdn.net/a6383277/article/details/23100421 轉載請註明出處
  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:

<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

轉載請註明出處謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章