2017-10-19 91 views
1

我嘗試進行tcp通信,其中服務器每隔x秒通過一個套接字發送一條消息,並且應該停止發送這些消息,而客戶端沒有發送任何消息5秒鐘。 更爲詳細的是,客戶端還會發送一些常數消息,這些消息在與上面相同的套接字上被服務器忽略,並且可以在任何未知的時間停止發送它們。爲簡單起見,這些消息用作活動消息來通知服務器通信仍然相關。檢測tcp客戶端未處於活動狀態的時間超過5秒

問題是,如果我想從服務器發送重複的消息,我不能允許它「忙」並開始接收消息,因此我無法檢測到新消息何時從另一端到達並相應地採取行動。

這個問題是獨立於編程語言,但更具體的即時通訊使用Python,並且不能訪問客戶端的代碼。

是否有任何選項可以同時在單個套接字上接收和發送消息?

謝謝!

回答

0

選項1

使用兩個線程,一個會寫信給插座和第二將從中讀取。

由於套接字是全雙工的(允許雙向同時訪問),因此可以使用。

選項2

使用管理所有保持活動使用select.epoll一個單獨的線程。這樣一個線程可以處理多個客戶端。請記住,如果這不是唯一使用套接字的線程,那麼您可能需要自行處理線程安全。

0

正如在另一個答案中所討論的那樣,線程是一種常見方法。另一種方法是使用事件循環和非阻塞I/O。 Python的最新版本(我認爲從3.4開始)包含一個名爲asyncio的包,它支持這個。

您可以調用event_loop上的create_connection方法來創建asyncio連接。請參閱this example,瞭解通過TCP讀取和寫入的簡單服務器。

在許多情況下,事件循環可以允許比線程更高的性能,但它的缺點是要求大部分或全部代碼知道事件模型。

相關問題