2013-01-10 423 views
1

我正在開發一個基於Java的多人回合策略遊戲(包括客戶端和服務器)。我在網絡遊戲方面沒有太多經驗,但是我做了一些小事情,比如多客戶聊天和雙人遊戲,帶插座的遊戲。我不想找人爲我編碼,只是給我一些指導。Java多人遊戲網絡概念

遊戲經歷了多個階段:首先是用戶連接和登錄。之後他可以選擇主持/參加一場比賽。在他加入某個遊戲或某人加入他的遊戲之後,客戶會轉到遊戲階段。遊戲是1v1,只需要每5秒發送一次數據(如果這很重要?)。我只需要一些關於如何設計客戶端/服務器來通過這些「階段」的指導。

這是我當前如何想實現它:

  1. 當連接時連接將有一個描述服務器狀態的相應變化。例如:0登錄之前,1登錄之後,2登錄之後,等等......

  2. 只要客戶端發送數據到服務器,它就會檢查狀態並相應地處理它。就像在登錄之前發送數據一樣,服務器將假定它是登錄細節,如果它們有效,它將變量更改爲1,並告訴客戶端前進。

有沒有更好的方法來做到這一點?

回答

1

基本上你如何描述它是它是如何常見的做。只需讓服務器監聽客戶端連接,然後在自己的線程中處理客戶端連接。然後來回發送消息以確認狀態(登錄與註銷,加入遊戲等)以及遊戲中的消息供玩家移動。無論是TCP還是UDP套接字在短期內都能正常工作,但是最終您可能會切換到主要基於UDP的系統,因爲在服務器和客戶端之間發送的消息將相當小,並且延遲可能是取決於遊戲類型的關鍵。

考慮通過JSON發送/接收消息(http://wiki.fasterxml.com/JacksonHome是最後一次相當流行的Java解析器)。

此外,你需要在服務器端的幾個數據結構來有效地管理客戶端及其狀態。例如,您可以爲每個客戶端設置一個整數ID,並使用Map<Integer, Client>來存儲當前連接的所有登錄用戶,其中Client是存儲該用戶當前狀態的某個對象。

希望這給你一些想法從哪裏開始。

+0

由於工作的客戶端計劃!回答我的問題並添加了一些有用的信息! – Tukhes

1

既然是完整的Java +客戶端服務器+遊戲:

我建議你忘記使用直接套接字。

在我看來,Java RMI是你最好的選擇。

爲什麼一旦你學到了?:比插槽更容易

  • 您可以直接從您的Java客戶端/服務器調用遠程方法。

  • 您可以使用回調。 (即服務器測試的客戶端仍連接)

可能有更多的理由......

+0

感謝您的貢獻,抱歉不會說出去的問題,但如果一切順利的話,我可能就做的手機,其RMI不會爲不幸的是:( – Tukhes

0

您可以使用Mina或Netty作爲Nio套接字框架。在服務器和客戶端中使用Java可以更容易地設計消息協議。當一個客戶端移動時,您向服務器發送移動消息,然後服務器將消息推送給兩個客戶端。兩個客戶端在收到消息時一起移動。因此,如果避免網絡延遲,兩個客戶端同步移動。 你可以看看用java編寫的開源遊戲框架。

java game server engine