開發基礎:伺服器變數

» 伺服器變數

SmartFoxServer 2X框架提供了不同類型的伺服器變數,可以用來維護跨使用者、房間甚至是好友列表中好友的同步狀態。

一般來說,伺服器變數允許客戶端或是伺服端邏輯建立客製化的值,並且能夠在所屬範圍內自動更新。下面是三個主個要的伺服器變數類型,有著不同的範圍:

  • 使用者變數(User Variables):代表附加到單一使用者身上的客製化資料。變數擁有者所加入的房間(可以是多個房間)內的所有使用者都會接收到所有的更新。 換句話說,一個叫做Piggy的使用者可以存取並取得所有關於Kermit 使用者的變數更新,假如他們兩個加入到同一個房間的話。常見的使用案例是儲存使用者的檔案或遊戲資料(分數、階級、年齡、興趣、頭像、遊戲成就)。
  • 房間變數(Room Variables): 代表附加到房間物件的客製化資料。其範圍是房間本身,所以使用者可在加入個別房間後存取房間變數。但也有方法可以讓這些變數變成從房間外也是可見的並且接收更新。常見的使用案例是保存遊戲的狀態與屬性(技能等級、分數、最佳分數、當前遊戲狀態…)。
  • 好友變數(Buddy Variables): 代表附加到在一個或多個好友列表中的好友物件的客製化資料。 範圍是好友列表本身,所以說任何人在他們的列表中加入一個叫做Gonzo 的使用者,就會看見並且接收他的變數的更新。最有用的應用是即時的維持每個好友狀態的更新。

» 一般架構

下面的列表描述每個變數類型的屬性。從簡單的BuddyVariable 開始,揭露了基本的名稱與值屬性,到最複雜的房間變數更是提供幾個更多的特性。

類型

屬性

說明

Buddy Variable

name

變數名稱

 

value

變數的值

 

 

User Variable

isHidden

假如設定為true,該變數會是一個只存在伺服端的變數,客戶端將不會接收到任何更新。

 

 

Room Variable

isPrivate

假如設定為true,該變數只能由建立者變更。

 

isPersistent

假如設定為true,該變數會持續存在直到建立者登出系統。

 

isGlobal

假如設定為true,在房間外將會是可見的。

讓我們更深入地了解每個屬性::

  • name: 可以是任何的有效字串,但要記住簡短的名稱使用較小的位元組,也因此會占用較小頻寬。通常2-5個字元足以定義你的變數。
  • value: 所有的伺服器變數都支援數個基本型別:
    • Null (只有在刪除變數時會使用)
    • Boolean
    • Integer (signed 32 bit)
    • Double (64 bit double)
    • String (up to 32768 characters)
    • SFSObject
    • SFSArray
  • isHidden: 預設情況下所有的變數都不是隱藏的。你可以為使用者變數與房間變數開啟這個旗標,讓變數只保存在伺服端。客戶端將無法接收到關於隱藏變數的任何的更新。這個旗標只能在伺服端取得。
  • isPrivate: 假如設定此屬性,房間變數只能由其建立者修改或刪除(預設值為false)。
  • isPersistent: 預設情況下,使用者建立房間變數會在該使用者離開房間時被移除。假如這個旗標被開啟,變數將會持續存在直到使用者登出或是連線中斷。(預設值為false)。
  • isGlobal: 全域的房間變數可以在房間外看見,這意謂著即便使用者沒有加入到房間中也能夠存取並且接收其更新。運行太多的全域變數會占用明顯的頻寬在一個高流量的伺服器中。謹慎使用(預設值為false)。

靜態房間變數:
使用者變數與好友變數只能藉由程式碼動態的建立,而房間變數還可以在設置階段靜態的建立。關於這點,你可以參閱AdminTool 的區域設定器以學習到更多。

» 使用範例

下面你會發現一些例子,示範在Actionscript 3中的客戶端API,如何使用房間與使用者變數。我們會選擇這個語言是因為他是經常使用的,而且與C#跟Java十分類似。幾乎不需要費什麼力就能將範例轉換成任何其他的API語言。

在服務器端使用變數也同樣簡單,並且使用相同的界面和邏輯。

最後,好友變數使用Buddy List API來分開處理。

使用者變數(User Variables)

這個範例示範使用者如何使用變數儲存他的個人資料並且自動更新到相同房間中的其他客戶端。

var avatarPic:UserVariable = new SFSUserVariable("avt", "MissPiggy.png");
var occupation:UserVariable = new SFSUserVariable("occ", "Acting and singing");
var location:UserVariable = new SFSUserVariable("loc", "Muppet's Show");
 
sfs.send( new SetUserVariablesRequest( [avatarPics, occupation, location] ));

要接收到更新,客戶端必須要監聽SFSEvent.USER_VARIABLES_UPDATE 事件:

sfs.addEventListener(SFSEvent.USER_VARIABLES_UPDATE, onUserVarsUpdate);
 
// ...
 
private function onUserVarsUpdate(evt:SFSEvent):void
{      
    // The User that changed his variables
    var user:User = evt.params.user as User;
     
    // Do something with these values...
    trace("Location: " + user.getVariable("loc").getValue());
    trace("Occupation: " + user.getVariable("occ").getValue());
     
    // etc...
}

房間變數(Room Variables)

下面是一個快速的範例,四範如何在客戶端設定一個私有的房間。:

var chatRoomTopic:RoomVariable = new SFSRoomVariable("topic", "Multiplayer Game Development");
chatRoomTopic.isPrivate = true;
 
sfs.send( new SetRoomVariablesRequest( [chatRoomTopic] ));

其他客戶端必須要監聽SFSEvent.ROOM_VARIABLES_UPDATE事件並且像這樣處理它:

sfs.addEventListener(SFSEvent.ROOM_VARIABLES_UPDATE, onRoomVarsUpdate);
 
// ...
 
private function onRoomVarsUpdate(evt:SFSEvent):void
{
    // An array of variable names that were updated for the Room
    var changedVars:Array = evt.params.changedVars as Array;
     
    // Obtain the variable and show the new value
    var topicRV:RoomVariable = sfs.lastJoinedRoom.getVariable("topic");
     
    trace("The Room topic is now set to: " + topicRV.getValue());
}

» 在伺服端的變數

下面範例示範在以Java撰寫的伺服端擴展中,如何與使用者變數以及房間變數共同運作。

使用者變數(User Variables)

讓我們設定一對使用者變數。其中一個使用hidden 屬性讓變數只存在在伺服端中。

private void setUserProfile(User user, int databaseId)
{
    // public user var
    UserVariable avatarPic = new SFSUserVariable("pic", "GonzoTheGreat.jpg");
     
    // private user var
    UserVariable dbId = new SFSUserVariable("dbId", databaseId);
    dbId.setHidden(true);
     
    // Set variables via the server side API
    getApi().setUserVariables(user, Arrays.asList(avatarPic, dbId));
}

房間變數(Room Variables)

現在讓我們看一下房間變數。一個有趣的事情是,在伺服端建立的房間變數它們的建立者會是伺服器本身。就像是來自客戶端地建立者會是送出請求的使用者一樣。

這意味著與客戶端產生的房間變數相比,伺服器建立的房間變數將永遠不會過期。這可以被用來維持在需要它的任何房間內完全持續存在的值。

private void setupRoomVariables(Room room)
{
    // Private Global Room variable, no one will be able to overwrite this value
    // The topic will be visible from outside the Room
    RoomVariable chatTopic = new SFSRoomVariable("topic", "Multiplayer Game Development");
    chatTopic.setPrivate(true);
    chatTopic.setGlobal(true);
     
    // Secret variable, only accessible from server side
    RoomVariable isModerated = new SFSRoomVariable("isMod", true);
    isModerated.setHidden(true);
     
    // Set variables via the server side API
    // Passing null as the User parameter sets the ownership of the variables to the Server itself
    getApi().setRoomVariables(null, room, Arrays.asList(chatTopic, isModerated));
}

» Learning more

為了要學習更多關於伺服端變數,我們建議查看你選擇平台的特定伺服端與客戶端API。你可以在左邊API Documentation章節下的選單中找到所有的連結。(維克:請參考官網,我這左邊這東西讓你點>”<)。

上一篇:開發基礎:房間結構

下一篇:開發基礎:SFSObject 與 SFSArray

 
 

  按個讚!~支持本站!~

FB推薦載入中