寫在前面的話
- 該篇博客主要講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
轉載請註明出處謝謝!