開發基礎:連線階段

開發基礎:» 連線階段

連線到SFS2X分成兩個步驟來執行:

一個物理TCP連線被打開以連接到伺服器。

客戶端與伺服端完成"握手(handshake)"的動作,並且交換了一些參數。

在握手期間,伺服端會驗證客戶端API版本是否支援,並且傳回一些客戶端會儲存在本地的設定。

下面的ActionScript 3程式碼片段是由範例包中的連線(Connector)範例取得:

public class Connector extends Sprite
{   
    private var sfs:SmartFox
     
    public function Connector()
    {
        // Create an instance of the SmartFox class
        sfs = new SmartFox()
     
        // Turn on the debug feature
        sfs.debug = true
         
        // Add SFS2X event listeners
        sfs.addEventListener(SFSEvent.CONNECTION, onConnection)
        sfs.addEventListener(SFSEvent.CONNECTION_LOST, onConnectionLost)
        sfs.addEventListener(SFSEvent.CONFIG_LOAD_SUCCESS, onConfigLoadSuccess)
        sfs.addEventListener(SFSEvent.CONFIG_LOAD_FAILURE, onConfigLoadFailure)
         
        // Connect button listener
        bt_connect.addEventListener(MouseEvent.CLICK, onBtConnectClick)
 
        dTrace("SmartFox API: " + sfs.version)
        dTrace("Click the CONNECT button to start...")
    }   
     
    private function onBtConnectClick(evt:Event):void
    {
        // Load the default configuration file, config.xml
        sfs.loadConfig()
    }
 
    //:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
    // SFS2X event handlers
    //:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
     
    private function onConnection(evt:SFSEvent):void
    {
        if (evt.params.success)
        {
            dTrace("Connection Success!")
        }
        else
        {
            dTrace("Connection Failure: " + evt.params.errorMessage)
        }
    }
     
    private function onConnectionLost(evt:SFSEvent):void
    {
        dTrace("Connection was lost. Reason: " + evt.params.reason)
    }
     
    private function onConfigLoadSuccess(evt:SFSEvent):void
    {
        dTrace("Config load success!")
        dTrace("Server settings: " + sfs.config.host + ":" + sfs.config.port)
    }
     
    private function onConfigLoadFailure(evt:SFSEvent):void
    {
        dTrace("Config load failure!!!")
    }
 
    //:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
    // Utility methods
    //:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
 
    private function dTrace(msg:String):void
    {
        ta_debug.text += "-- " + msg + "\n";
    }   
}

程式碼由建立SmartFox 物件開始,SmartFox 是主要的API類別。然後我們使用SFSEvent類別,對我們想要監聽的伺服器事件進行註冊。

下一步是載入external .xml 組態檔案,其中包含了連線的細節。這是個方便的方法,能夠保持連線參數與程式碼分開。因此可以在任何時間改變而不需要重新編譯程式碼。假如你熟悉SmartFoxServer 1.x ,你會發現這系統與前一代十分類似。

注意:你可以不用設定任何組態,假如你採用標準的版本,一個叫做sfs-config.xml的檔案。

請參考這份教學以取得更詳細的資訊。(連結是flash教學,unity請參考這份。)

» 連線後要做什麼:

與伺服器連線只是確定客戶端能與SFS2X 協定開始對話,但在這時候的客戶端在系統中還不是一個真實的使用者。在與伺服器和其他使用者自由互動前,還有一個必要的步驟:登入。

登入階段使得連線的客戶端進階成為真實的使用者並且將使用者加入至一個可得的區域。但是在我們移到第二個階段前,還有一些關於連線的事情需要檢查。

» 會出現問題的地方

在本地環境下,不太可能會出現問題,所以你應該能夠很快地建立起連線。但是在internet上,有著"真實客戶"的產品伺服器,可能會發生一下問題。

通常情況下,你可能會發現使用者抱怨連線失敗的原因是下面幾中理由之一。

防火牆的問題:客戶端處在一個不允許連接預設伺服器port(TCP 9933)的防火牆內,假如客戶端執行的是本地防火牆,建議是給SFS2X port權限。另一方面,若是客戶端在企業防火牆內,則需要使用BlueBox 連線來解決這問題。(後面會再討論更多)

代理伺服器問題:代理伺服器可能會處在客戶端與伺服端中間,導致建立直接的socket連線變成不可能,一樣的是,這也是企業網路的常見狀況而BlueBox 一樣也能解決這問題。

Flash Player與Unity Player 跨網域政策問題:基於瀏覽器的插件,像是Flash 與 Unity,需要特殊的權限以存取網域外的資源。因為這理由,你可能需要設置一個跨網域政策檔案已允許socket 連線到SFS2X.

你可以在這份導覽中找到其他客戶端連結問題排除的資訊。

BlueBox的技術包含在SFS2X中,這與他的前一代是選擇性的附加有所不同。BlueBox 提供了高效能的HTTP通道引擎,允許使用者能在代理伺服器與其他具限制的網路情況下依然能夠以全速來享受多人應用程式與遊戲。

你可以在這個專用文件上閱讀所有關於BlueBox 的資訊。

» 高彈性連線(HRC)系統

在SFS2X中引入的一個重要功能,是一個低階機制,能夠以一個對開發者完全透明的方式恢復突然的斷線。當你的區域中開啟了HRC,客戶端API會偵測非預期的斷線並且在一定的時間內嘗試重新連線到伺服端,該時間定義在Zone階層中。

整個過程發生在幕後而開發者會收到不同事件的通知。

CONNECTION_RETRY: 當API偵測到突然的斷線時會發出此事件,並且進行重新連線。

CONNECTION_RESUME: 當重新連線成功後會收到此事件,如果重新連線失敗則會收到SFSEvent.CONNECTION_LOST事件。

在伺服端中,一個擴展的開發者可以使用相同的方法處理這些狀況,也就是監聽SFSEventType.USER_RECONNECTION_TRY 與 SFSEventType.USER_RECONNECTION_SUCCESS 事件。

要開啟這個功能,你需要設定使用者重新連線的timeframe參數,此參數在AdminTool中的Zone Configurator模組中的General分頁標籤中。(如下圖)

參數的值是以秒為單位,而任何一個大於0的值都會開啟這個系統。依據應用程式的需求與伺服器邏輯對於等待斷線玩家的敏感度來說,通常其值設定的範圍是介於30到60秒之間。

要測試重新連線的功能,你可以就呼叫由SmartFox 所揭露的客戶端API的方法 killConnection()來模擬突然性的斷線。

注意,不要拉掉網路線或是關掉WIFI連線來測試重新連接系統,兩種操作都會停掉現行的socket連線,所以重新連線事件就永遠不會被觸發。

更詳細的HRC+ system 概觀請參考這裡

上一篇:Smartfoxserver開發基礎:介紹   

下一篇:開發基礎:登入階段

 
 

  按個讚!~支持本站!~

FB推薦載入中