2012-07-30 33 views
2

我正在開發一個羣聊應用程序來學習如何使用套接字,線程(也許)和asycore模塊(也許)。 我的想法是客戶端 - 服務器體系結構,以便當客戶端連接到服務器時,服務器向客戶端發送其他連接(其他客戶端'用戶名',ip地址)列表,然後一個人可以連接到一個或更多的人在一次和服務器將建立一個客戶端之間的P2P連接。我有套接字部分工作,但服務器一次只能處理一個客戶端連接。
什麼是處理多重連接的最佳,最常見,最實用的方法? 當我的新連接進入服務器,然後連接不同的客戶端連接,或使用asycore模塊,我知道使服務器將相同的數據發送到多個套接字(連接)和我只需要調整數據的位置。使用線程或asycore在Python中的羣聊應用程序

任何幫助/想法/建議,將不勝感激。

回答

1

對於一組聊天應用,一般的方法將是:

服務器側(接受處理):

  • 創建插座,將其綁定到一個衆所周知的端口(和適當的接口)和聽
  • 雖然(app_running)
    • Client_socket =接受(使用的ServerSocket)
    • 產生新線程,並通過此socke t到線程。該線程處理剛剛連接的客戶端。
    • 繼續,以便服務器可以繼續接受更多連接。

服務器端客戶端MGMT主題:

  • 而app_running:
    • 讀取傳入消息,並存儲到隊列或東西。
    • 繼續

服務器端(羣聊處理):

  • 對於所有連接的客戶端:
    • 檢查他們的隊列。如果任何消息存在,發送到所有連接的客戶端(包括髮送此消息的客戶 - 用作ACK那種)

客戶端:

  • 創建套接字
  • 通過IP地址連接到服務器,端口
  • 做發送/接收。

上面可以有很多改進。就像服務器可以輪詢套接字或在一組套接字上使用「select」操作一樣。這會使它更有效率,因爲每個連接的客戶端都有一個單獨的線程會有很多時候會過量。 (想想每個線程1MB的堆棧)。 PS:我還沒有真正使用過asyncore模組。但我只是猜測,你會發現一些性能改善,當你有很多連接的客戶端和非常少的處理。

+0

雖然做了一些更多的挖掘我在Python中讀取,它會更好地使用進程比線程。使用其中一種還是有優勢/劣勢? – 2012-07-31 13:22:48

相關問題