隨筆 - 8  文章 - 55  trackbacks - 0
          <2025年5月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          常用鏈接

          留言簿(6)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          朋友的Blog

          最新評論

          閱讀排行榜

          評論排行榜

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

          .Servermethod如何被呼叫
          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(){}
          .sendcall這兩個method在使用上有何差異?如何使用
          call:methodClient端上可使用的是netconnection對象,在Server端上可使用的是
          netconnectionClient物件
          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的包含SharedObjectnetStream
          send這個method很有趣,他讓你由client端去啟動所有同在client端的function,但因為
          在觸發function時可以帶參數過去,這個特性是可以讓你利用來做小量數據的廣播的,要
          廣播給所有人接收到的數據,并不一定就要放在SharedObject內,利用其onSync來做同步
          ,有時用send也是一個很簡單的做法,如何定義
          1.netStreamSharedObject上定義好method "myfun"
          2.利用netStream.send("myfun")sharedobject.send("myfun"myvar)可讓所有client
          上的"myfun"都會被觸發

          .幾種可能的互動型態范例
          1.Client端對Server端傳送data或呼叫執行Serverfunction
          應用范例:一個簡易聊天室,聊天內容只存在Server端的變量內,不使用SharedObject存放呼
          Server端的messagemethod來處理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并執行指定Clientfunction
          應用范例:以之前在站上回復過的問題為例,一個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(newClientpwd){
          if(pwd=="ok"){
          application.acceptConnection(newClient);
          newClient.call("get_message"nullmessage);
          }else{
          application.rejectConnection(newClienterrObj);
          }
          }
          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.onStatushandler內由判斷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"nullsendvar);
          }
          }
          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);
          };

          說不上貢獻,在FCS提供的help 就有提到了..
          posted on 2006-06-22 13:46 blog搬家了--[www.ialway.com/blog] 閱讀(463) 評論(0)  編輯  收藏 所屬分類: FMS
          主站蜘蛛池模板: 阿坝县| 杨浦区| 建德市| 咸阳市| 浠水县| 梁平县| 兰坪| 乾安县| 新田县| 八宿县| 萝北县| 法库县| 嘉鱼县| 江永县| 桐梓县| 蓝山县| 沅陵县| 车险| 吕梁市| 临汾市| 武山县| 广水市| 五家渠市| 益阳市| 锡林浩特市| 茶陵县| 抚松县| 隆化县| 繁昌县| 临漳县| 互助| 仙居县| 临颍县| 镇坪县| 巴里| 枝江市| 丽水市| 莫力| 西城区| 会宁县| 思茅市|