2014-10-11 65 views
1

我正在使用python中的SocketServer模塊構建一個TCP服務器。發送郵件到客戶端使用PythonServer中的SocketServer

在我看來,SocketServer.TCPServer功能註定要回復發送請求到服務器的客戶端,但不是服務器和客戶端之間的隨機通信。例如 - 服務器和客戶端之間的聊天..

有沒有什麼辦法只是發送消息到某些客戶端註冊到服務器?

我現在代碼:

import SocketServer 
import chathandler 
import threading 

PORT = 12345 

def do_main(): 
    global httpd 

    Handler = chathandler.ChatHandler 

    httpd = SocketServer.TCPServer(("", PORT), Handler) 

    print "Serving at port:", PORT 
    httpd.serve_forever() 

if __name__ == '__main__': 
    server_thread = threading.Thread(target = do_main) 
    server_thread.start() 

    while True: 
     print "Send message to the clients" 
     s = raw_input(": ") 
     # TODO: Send the message! 

在這個例子中,我想將消息發送給所有連接到服務器的客戶端。

謝謝!

+0

你能解釋一下你用哪種功能提供的東西。 – 2014-10-11 14:17:27

+0

我能找到的基本用途是2個或更多客戶端和作爲中繼站的服務器之間的聊天。當它從一個客戶端獲得消息時,它需要將其傳遞給所有其他客戶端。 – user3848844 2014-10-11 14:57:19

回答

0

我解決這個問題的方法是使用HTTP persistent connection。 由於可以從文章被引用:

HTTP持久連接,也稱爲HTTP保持活動,或HTTP 連接複用,是使用一個TCP連接發送 和接收多個HTTP請求的想法/響應,而不是爲每個請求/響應對打開一個新的連接 。

BaseHttpRequestHandler類(ChatHandler從繼承)有一個稱爲「PROTOCOL_VERSION」構件正如我們可以在其文檔中看到:

這指定在響應中使用HTTP協議的版本。如果設置爲 'HTTP/1.1',服務器將允許HTTP持久連接;然而,您的服務器必須在其所有對客戶端的響應中包含一個準確的Content-Length 標頭(使用send_header())。對於 向後兼容性,該設置默認爲'HTTP/1.0'。

如此,通過分配Handler.protocol_version =「HTTP/1.1」時,連接將不會立即處理一個請求之後關閉,但將保持處理其他的請求,以及。因此,我所做的最後一件事情是取代TCPServer的get_requestclose_request方法。

get_request被調用來接受連接。

close_request被調用來關閉連接。

get_request我接受連接到添加到所有當前連接的列表的連接後添加的命令和在close_request我添加了一個命令以刪除從同一列表此連接。

相關問題