開發基礎:登入階段

»登入階段

在前一個章節,中我們已經見過如何連線到SmartFoxServer,也提到過客戶端在開始與伺服器API與其他使用者互動前,需要先登入到區域中。

為了看到在服務器中可得的區域,以及建立一個新的區域。你可以使用SFS2X 的Admin Tool。在工具欄的左側中選擇Zone Configurator ,然後會出現區域(Zones)的列表。

從這裡你可以雙擊(或是選擇然後點選編輯按鈕(edit button))任何一個區域名字,並且進行區域設定的配置。請參閱Zone Configurator文件的用法。

» 預設vs 客製化登入

在我們開始看登入請求的基本程式碼之前,我們必須要將注意力移到一個非常重要的區域設定,稱之為Use custom login(使用客製化登入)。這設定就在區域配置中的區域名字後面。

這個參數(預設為關閉)的值決定哪個控制器會接收與處理登入請求。

  • customLogin 設定為false時: 系統控制器會處理登入階段。這種情況下任何使用者名稱都會被接受,除非有其他已登入的使用者有相同的名稱。而登入密碼會被忽略。假如傳遞給伺服器的使用者名稱是空字串,則伺服器會自動產生一個”guest”的使用者名稱(譬如Guest#42)。
  • customLogin 設定為true:擴展控制器會處理登入階段。並且允許開發者使用擴展來驗證使用者的憑證與完成任何需要的操作。

»登入到一個區域

登入階段是由客戶端送出LoginRequest 到伺服端開始。這個會需要幾個參數:

  • user name: (可選的) 使用者的名稱
  • password: (可選的) 密碼
  • Zone name: 區域的名稱;區域必須是伺服端存在的區域。
  • extra parameters: (可選的) 包含客製化資料的物件;通常是與基於擴展的登入配合使用,以傳送客製化資料到伺服端中。

登入到一個區域中只需要幾行程式碼:本質上來說,你只需要註冊SmartFox類別的實例來接收SFSEvent.LOGIN 以及SFS就可以了。

var sfs:SmartFox = new SmartFox();
sfs.addEventListener(SFSEvent.LOGIN, onLogin);
sfs.addEventListener(SFSEvent.LOGIN_ERROR, onLoginError);
...
...
 
// This code is executed after the connection
sfs.send( new LoginRequest("", "", "SimpleChat") );
public function onLogin(evt:SFSEvent):void
{
    trace("Login success: " + evt.params.user.name);
}
 
public function onLoginError(evt:SFSEvent):void
{
    trace("Login failed: " + evt.params.errorMessage);
}

在上面ActionScript 3的例子中,我們使用一個預設的登入(由系統控制器處理),並且傳送一個空字串當成使用者名稱,所以會取得一個自動產生的訪客名稱。

注意: 當你載入外部配置檔案時,就不需要再傳送區域名稱到LoginRequest的建構子中,API會自動取得。

下面是另一個LoginRequest 的片段:

sfs.send( newLoginRequest("Fozzie") );

在這個例子中,我們送出使用者名稱,沒有密碼,也沒有指定區域名稱,系統會使用由配置檔案載入的區域名稱。

» 會出錯的地方?

在登入階段中,伺服器完成了一系列的驗證,這可能會阻斷進程,並且發送出SFSEvent.LOGIN_ERROR事件,讓我們簡短地來看一下會有什麼問題出現。

  • Missing Zone(找不到區域): 請求的伺服器名稱並不在伺服器的可得的區域中。
  • Zone full(區域已滿): 請求的區域以達到最大允許的使用者數量。(在AdminTool 的Zone Configurator模組中配置)。
  • Server full(伺服器已滿): SmartFoxServer 實例已達大最大容量,無法再接受其他使用者。
  • Duplicate names(重複名稱): 一個區域中不能有兩個使用者有相同的名稱。這是大小寫敏感的,所以"Fozzie"與"fozzie" 並不會有任何問題。
  • Bad Words in user name(使用者名稱中有不好的字):假如在區域的設置中有設定字詞過濾器(Word Filter),而且使用在使用者名稱中,若是名稱符合過濾器中的謾罵字眼設定,就會發出錯誤。
  • Banned user name(拒絕使用者名稱): 假如提供的使用者名稱被主席或管理者設定為拒絕登入,客戶端將不能登入區域中,直到拒絕時間過期。

»房間列表

在第一個程式碼範例中我們看到了當登入成功時,伺服器會將使用者加到登入請求中設定的區域中。而在背後,SmartFoxServer也完成了一些我們需要知道的操作。

  1. 自動訂閱預設的房間群組:在區域配置器中,你可以宣告一些公開的房間群組。預設情況下只有一個稱之為”default” 的群組,如果需要的話,你可以新增更多的群組。房間群組其實只是一個字串id,用來將房間組織為不同分類的房間群組。
    再登入後客戶端會自動訂閱在區域群組設定中指定為Default 的群組。
  2. 將初始房間列表填充到客戶端中:在背景中,客戶端會接收到一個房間列表,其中包含了所有訂閱群組中的房間。這動作只在登入時做一次,往後只有小改變會被送到客戶端以維護房間列表能與Server 端相同。

在這個範例中,上面的區域包含了三個不同的房間群組,分別為Europe,America ,與Asia。每個都負責維護某些數量的房間。假如我們假設區域的預設群組(default Group)被設定為Europe與America,那麼客戶端房間列表將會填充這兩個群組中的房間的詳細信息,並且會接收到任何”有興趣”的更新(譬如說一個新房間的建立或是移除等等…)。

你可以閱讀關於群組的額外訊息在這篇文章(翻譯文)中。

» 客製化登入

在登入時一個非常常見的使用狀況是撰寫一個擴展來處理使用者驗證與資料庫的比對檢查。要做這些動作會需要一些初步的步驟。

1.      設定資料庫連線。你可以參考這篇教學,以了解如何設定SFS2X ,使之能與資料庫連線。

2.      準備一個簡單的擴展,用來執行使用者名稱與密碼的驗證。我們提供一個深入的擴展概觀以及如何客製化登入教學(翻譯文)。

3.      將在區域配置中(Zone Configurator)的使用客製化登入( Use custom login )設定開啟,並且設定你的擴展。

上一篇:開發基礎:連線階段

 
 

  按個讚!~支持本站!~

FB推薦載入中