2012-12-23 128 views
0

我正在嘗試構建一個處理多個客戶端的聊天服務器。我正在嘗試在新線程上處理每個連接的客戶端。問題是,我對如何將從客戶端收到的消息轉發給預期的接收者感到困惑。我的意思是client-1到client-5。我對套接字編程非常陌生。因此,任何形式的幫助表示讚賞。Python:多客戶端線程聊天服務器

+0

從這裏開始:http://twistedmatrix.com –

+0

不能沒有扭曲呢?我真的很想了解實施它的想法。 –

+0

閱讀beej的網絡編程指南。它在C中,但Python只是包裝這個相同的API。 –

回答

1

這是您的服務器的僞設計。我會用編程語言不可知的術語說話。

有一個「全局散列表」,它將「客戶端ID號」映射到相應的「套接字」(以及任何其他客戶端數據)。任何對這個哈希表的訪問都有一個互斥量來保護。

每當你接受一個新的連接時,啓動一個線程。我假設您的聊天協議中有一些內容是客戶端標識自己,獲取客戶端ID號並分配給會話的。線程所做的第一件事是將此客戶端連接的套接字添加到散列表。每當有消息進入(例如,從客戶端1到客戶端5)時,在哈希表中查找「客戶端5」以獲取其套接字。轉發此套接字上的消息。

有幾種競爭條件可以解決,但這應該是一個足夠體面的設計。

當然,如果你真的想擴展,你不會做「每線程線程」方法。但是,如果您僅限於同時連接的大約100個或更少的客戶端,則無問題。之後,您應該考慮使用非阻塞I/O的單線程方法。