2016-11-15 68 views
1


我目前正在開發遊戲服務器部分(MMORPG),而且我對一個看起來很重要的觀點感到困惑:如何管理客戶端及其邏輯接收的數據包?管理世界服務器上的玩家

讓我解釋一下:我知道如何從客戶端獲得連接,如何存儲此客戶端的套接字,但我不知道如何管理稍後將發送的數據包並將修改應用到服務器上全部是異步的)。

我曾想過2個解決方案:
1)只要服務器檢測到客戶端的連接,它爲客戶端創建一個線程。所以每個客戶端有一個線程可以處理單個客戶端的數據包。但在這種情況下,有更多的客戶,更多的處理器將被稱爲正確的?

2)只要服務器檢測到新客戶端,就將其存儲在列表中。線程將在客戶端列表上循環,看看當前客戶端是否正在發送數據包。如果是這樣,它管理它。但是這個解決方案也帶來了一個問題:如何管理這個數據包?創建一個專門用於這個數據包的新線程?但是我回到起點:太多數據包會使機器過載。

一位朋友向我提供了第三種解決方案:將兩者混合。這樣,一個線程會處理NB_MAX_CLIENT。

我想知道是否有其他方式做到這一點。 我在Windows上。我用C++開發Visual Studio,並使用Winsocks。

在此先感謝和抱歉我的英語不好。

+2

我會說讓它爲5個客戶端工作,不要再擔心。你將面臨比打開太多線程更大的問題。您將能夠回來並使其更好地擴展,但如果您在擴展方面遇到太多問題,您可能永遠不會有需要擴展的項目。 – Guvante

+0

延遲是一個問題嗎?如果不是,您可以使用MySQL來存儲數據,並使用分佈式控制來處理信息,使用多個虛擬機,因爲這是在雲服務上使用的東西,如果延遲是一個問題,那麼您確實需要在單個工作服務器上最大化資源並在可用節點上分配工作,使用單臺服務器告訴客戶端在任何可用工作節點「滿」時連接到哪裏 –

回答

1

只要服務器檢測到客戶端連接,它就會爲客戶端創建一個線程。所以每個客戶端有一個線程可以處理單個客戶端的數據包。但在這種情況下,有更多的客戶,更多的處理器將被稱爲正確的?

這是相當普遍的,除非你是從每一個線程需要的棧運行的RAM(通常OS線程需要每個物理線程的操作系統堆棧)。另一個問題是太多的上下文切換,可能會讓你考慮其他情況。

避免線程問題真的很困難,因爲您不必關閉數據結構就無法爲每個客戶端執行任何操作,因爲您不知道哪個堆棧會處理下一個數據包。

只要服務器檢測到新的客戶端,它存儲在列表中。線程將在客戶端列表上循環,看看當前客戶端是否正在發送數據包。如果是這樣,它管理它。但是這個解決方案也帶來了一個問題:如何管理這個數據包?

通常你爲此設置一個生產者消費者線程集。一個生產者獲取每個數據包並將其發送到隊列,然後由一些處理每個項目的工作線程消耗。

誠實地做這件事需要大量的工作(例如它是Netflix開發的一項主要技術),你可能應該避免它來簡化事情。

特別是因爲RAM很便宜,每個線程需要1MB的併發性,在專用線程堆棧殺死你之前,會使你從其他問題中解脫出來。(同樣,當上下文切換成爲你最大的問題時,除非你正在做一些與這個討論無關的錯誤,否則你會很快。

+0

謝謝您的回答。如果我理解正確,我只需將收到的數據包保存在列表中,然後使用線程列表管理它們? – DarkyZ

+0

@DarkyZShadow:這會起作用,你需要弄清楚一種同步方法,以確保你不會做不安全的跨線程讀寫操作,但有幾種方法可以解決這個問題。 – Guvante

相關問題