2011-12-28 118 views
1

我已經開始使用套接字進行遊戲,並且已經開始使用小遊戲進行測試。服務器是異步的,它運行良好,但並不好,所以我在尋找那些在應用中獲得好結果的人的指針。插槽的實現指針

場景: 在應用程序中我連接到Application_Launching/Application_Activated服務器和Application_Closing/Application_Deactivated斷開。 我注意到,在MSDN上的「Tic-Tac-Toe Over Sockets示例」中,每當數據已發送到應用程序時,它們都會關閉服務器上的套接字,並且每次將數據從應用程序發送到應用程序時連接到服務器。

討論: 人們是否更喜歡管理應用程序生命週期事件中的連接?對於每個操作來說,打開/關閉套接字似乎很奇怪,就像他們在樣本中所做的一樣。似乎取消了首先使用套接字的優勢。

場景: 假設我們正在實施某種比較長時間的配對方法。以20秒爲例。

討論: 當客戶端請求的對手,你寧願循環的客戶名單,並定期睡覺,直到合適的對手已經發現了什麼?或者你會推薦將客戶端添加到尋找對手的客戶端池中,並定期在一個單獨的線程中循環訪問?

底線是,如果有人使用套接字成功地實施了一個Windows Phone應用程序/遊戲,我很想得到你如何處理之類的信息:在

  • 連接生命週期
  • 長期運行的操作服務器
  • 客戶端「隨時」退出應用程序,包括在服務器上執行長時間運行的操作時。

回答

0

關於打開/關閉:在它每次操作後關閉套接字

MSDN樣本是大多數人可能使用的一個整潔的實用方法。但是在socket編程中沒有正確的方法。其實有很多!

關於線程:

  • 如果你使用(同步)阻塞的方法,如Listen然後循環和睡眠是一個壞主意。你不能取消一個阻塞方法。
  • 如果您使用(異步)非阻塞方法,如BeginSendBeginListen 那麼不需要線程。
+0

關於打開/關閉套接字:關閉套接字似乎不切實際,當您想在沒有客戶端發起「對話」的情況下將某些內容發送給客戶端時。關於線程:是的,我目前正在使用非阻塞版本(BeginX/EndX),而沒有任何其他線程。我在想那裏的配對情景。如果最好在BeginReceive回調中循環客戶端列表(有一些睡眠),直到找到合適的對手,或者將它們標記爲「尋找對手」,然後有一個單獨的線程來處理匹配。 – trydis 2011-12-28 11:40:57

+0

對不起,我不明白你的問題的細節。在這種情況下,我認爲所有的客戶端都可以連接到服務器,但他們的連接應該保持打開狀態。當找到匹配的對手時,通過相應的套接字發送消息(然後關閉它)。如果客戶端也在使用非阻塞方法,那麼他們會將套接字打開,知道他們處於等待狀態,直到他們收到了消息。而對於線程問題,我將使用單個線程(大廳)循環等待客戶端。我認爲這兩種方法的結合給了你更多的選擇。 – Bijan 2011-12-28 20:31:25

+0

對於遊戲本身,你需要找出一種方式,所有的客戶端總是開始對話而不是服務器。這樣您可以在每次對話後關閉套接字。你當然可以將插座打開直到遊戲結束。但根據我在套接字方面的經驗,持續時間短而且數量多的話更容易處理。 – Bijan 2011-12-28 20:36:04

0

有關異步套接字編程檢查開源網絡通信庫的好例子,networkComms.net

+0

謝謝,我已經簡要地看過它,並會在稍後閱讀。但是,最大的問題是優雅地處理客戶端(電話),這可以在任何時候「重新啓動」應用程序,稍後恢復,在視圖之間來回導航。以一種好的方式處理這個問題並通知對手現在讓我頭痛。 – trydis 2011-12-28 13:25:59