2011-12-07 115 views
0

我正在創建一個網絡遊戲應用程序,我正在嘗試利用WCF。最終,它將成爲點對點系統,但爲了開發目的,我已將應用程序拆分爲核心和播放器應用程序。這意味着WCF服務需要與主機和客戶端上的數據進行交互。所以我的問題是如何獲得服務與主機應用程序上的對象進行交互。如果我將ServiceBehaviour屬性的InstanceContextMode設置爲InstanceContextMode.Single,那麼我可以將一個類實例傳遞給ServiceHost構造函數,然後可以與Host對象進行交互,但是如何在將類類型傳遞給ServiceHost構造函數時執行此操作,如果我使用PerCall或PerSession InstanceContextMode,則必須執行此操作。與WCF服務中的主機對象進行交互

WCF服務的所有簡單示例都使用諸如計算器之類的東西。使用Calculator示例,您可以通過類/接口的方法參數從客戶端傳遞數據,並且不需要與主機上的任何對象進行交互。我是否使用錯誤的工具來完成這項工作?

回答

0

查看WCF中的全雙工通信...您應該能夠找到一大堆聊天室示例(這是一個很好的並行 - 許多客戶端通過中央服務器維護狀態)。

http://msdn.microsoft.com/en-us/library/ms731064.aspx

甲雙工服務合同是其中兩個端點 可以獨立消息發送到其他消息交換模式。因此,雙工 服務可以將消息發送回客戶端端點 ,從而提供類似事件的行爲。當客戶端連接到服務並且通過服務可以將消息發送回客戶端的通道 來發生雙工通信。請注意, 雙工服務的類似事件的行爲只能在 會話中使用。

編輯它看起來像問題有更多的是與如何訪問共享服務器狀態...

有許多方法可以做到這一點。這樣做的一個方法是創建一個管理共享狀態,在服務器端類的單一實例:

public class GameState 
{ 
    public static readonly GameState Instance = new GameState() 

    private GameState() 
    { 
    } 

    public PlayerPosition[] GetPlayerPositions() 
    { 
    } 
} 

然後,在作爲PerCall實現的服務:

public class MyGameService : IGameService 
{ 
     public PlayerPosition[] GetPlayerPositions() 
     { 
      return GameState.Instance.GetPlayerPositions(); 
     } 
} 
+0

我看着在早期的雙工通信。我還沒有弄清楚,如果他們比設立兩項服務更好,每個方向一項。但是,從主機訪問數據的相同限制適用於Duplex服務嗎? –

+0

在客戶端上使用全雙工與主機服務的方式是一個問題(注意 - 如果您必須處理NAT和防火牆,則需要全雙工)。但無論如何,你將不得不在服務器端訪問一些共享狀態。一種方法是公開某種單例服務器實例,並讓服務方法訪問該單例實例。我已經用一種方法更新了我的答案。 – RQDQ