Server端與Client端method觸發與data廣播概念

 Server端與Client端method觸發與data廣播概念

by ozzysun  出自:http://www.streetvoice.com.tw/diary/user-article.asp?dn=1733

        在FCS的應用上常會需要讓 Client 與 Server 間的數據傳遞與 method 呼叫,以下幾點概念應該可以
避免呼叫 method 沒反應或數據沒傳到你要的地方等狀況發生。

一.   Server端method如何被呼叫

Server 端上要能讓 Client 所呼叫觸發的 function,需定義在 Server 端的 Client 對象上你可以用 prototype 方式去 extend 原本 Client 類別的 method,讓 Client 類別所產生的 instance 都擁有該 method。

例:
Client.prototype.newfun=function(){}

你也可以把這 function 定義在單一 Client instance 下,

例:
application.onConnect(newClient)=function(){
.....
newClient.newfun=function(){}
}


二.   Client 端的 method 如何被呼叫

在 Client 端上要讓 Server 端可以呼叫的 function,一定要定義在 Netconnection上。

例:
nc=new NetConnection();
.....
nc.myfun=function(){}

三.   send call 這兩個 method 在使用上有何差異? 如何使用

call:  
         這 method 在 Client 端上可使用的是 netconnection 對象,在 Server 端上可使用的是 netconnection 與 Client 物件

1.在 Client 端利用 netconnection.call 來觸發執行 Server 端上 Client  對象的 method。
2.在 Server 端上利用 Client 對象 .call 來觸發 Client 端上 netconnection 上的 method。
3.在 Server 端上使用 netconnection.call 時,這時這 server 的角色就像一個 client 端一樣,是在觸發另一個 Server 端上 Client  物件的 method。

send:
         在 Client 端上可使用這 method 的包含 SharedObject 與 netStreamsend 這個 method 很有趣,他讓你由 client 端去啓動所有同在 client 端的 function,但因爲在觸發 function 時可以帶參數過去,這個特性是可以讓你利用來做小量數據的廣播的,要廣播給所有人接收到的數據,並不一定就要放在 SharedObject 內,利用其 onSync 來做同步,有時用 send 也是一個很簡單的做法,如何定義

1. 在 netStream 或 SharedObject 上定義好 method "myfun"
2. 利用 netStream.send("myfun") 或 sharedobject.send("myfun",myvar)可讓所有 client 上的 "myfun" 都會被觸發

四.幾種可能的互動型態範例

1.  Client 端對 Server 端傳送 data 或呼叫執行 Server function

應用範例:一個簡易聊天室,聊天內容只存在 Server 端的變量內,不使用 SharedObject 存放呼叫 Server 端的 message 這 method 來處理 client 傳上去的 msg 這對話內容

Client 端:

nc.call("message", null, msg);

Server 端:

application.onAppstart=function(){
application.chat_content="";
}
application.onConnect=function(newClient){
.......
newClient.message=function(msg){
application.chat_content+=msg;
}
}

2.  Client 端對所有 Client 廣播 data 並執行指定 Clien t端 function

應用範例:
        以之前在站上回復過的問題爲例,一個 clinet 要輸入一個網址 url_txt,要讓所有的 client 都會開啓這網址的網頁

Client 端:

先定義一個附掛在 so 上的 method
lobby_so.openPage=function(receive_url){
getURL(receive_url);
}

利用 send 就可讓所有 client 接收到這網址並開啓

lobby_so.send("openPage",url_txt);

3.Server 傳送 data給 特定 Client

應用範例:
        當有使用者聯機上 server,當使用者數據驗證正確時,接受其聯機,一方面要 client 去執行指定的 function 跳到某頁或讓某 mc 出現...,同時又要把 server 端的數據帶過去說明: server 只響應正在與 server 做互動的那個 client,如以上範例,server 只會去觸發請求聯機的該 client 去執行指定的 function,其它 client 不會有反應

Server 端:

application.onConnect=function(newClient,pwd){
if(pwd=="ok"){
application.acceptConnection(newClient);
newClient.call("get_message",null,message);
}else{
application.rejectConnection(newClient,errObj);
}
}

Client 端:
........
nc.get_message=function(message){};

4.Server 廣播 data給 所有 Client

應用範例:
        當有人斷線時,由 server 端廣播所有 client,讓所有 client 都能同步更新 client 名單說明:以上範例來說,當 clinet 無預警的斷線,只有 Server 上的 application.onDisconnect  這 handler 會被觸發,也就是說你需要在這 handler 內寫一些程序去廣播通知給所有的 client。

如何廣播?有以下兩種做法

1.把數據放在 remote SharedObject 對象內,只要 SO 對象內容更動,即自動觸發 Client 端的 so.onSync 將在線人員名單寫在 remote SharedObject 對象內,當有人斷線,只要把 so 內該筆數據剔除掉,因爲 so 內容改變,因此所有 Client 端的 so.onSync 這 handler 將被觸發,即可達到你要更新數據的目的。

Server 端

application.onDisconnect=function(newClient){
userlist_so.setProperty(newClient.name,"");
}

注:相對的當 server 端無預警的斷線,client 端可由 nc.onStatus 這 handler 內由判斷 info.code 來取
得信息

2.當數據不是存在 so 內時,只是存在 server 端的一個變量上,可以善加利用 application.clients 來對所有 client 廣播。以下會觸發所有 client 端上的 client_fun,並把 server 上的 sendvar 變量帶過去

server 端:

application.onDisconnect=function(newClient){
for(var i=0;i<application.clients.length;i++) {
application.clients[i].call("client_fun",null,sendvar);
}
}

Client 端:

nc.client_fun=function(myvar){ }

增加一個廣播的方法
Server  端傳送給有getRemote 同一個ShareObject 的Client 端

Server 端:

application.abc_so = SharedObject.get("abc_so", false);
application.abc_so.send("msgFromSrvr", msg);

Client 端:

abc_so = SharedObject.getRemote("abc_so", abc_nc.uri, false);
abc_so.msgFromSrvr = function(msg) {
showMsg(msg);
};

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