標籤:

python如何做一個實時檢測的服務端?

最近需要做一個tcp的服務端,正好在學python就邊做邊學了。用的是connection_list,參考的這裡http://www.cnblogs.com/hazir/p/python_chat_room.html

客戶機為一個智能設備,通過tcp協議發送特殊格式的數據包給ip:port,且並非實時發送數據,建立連接後沒三分鐘發一次心跳包表示存活

如果伺服器需要在某一個時間主動給指定ip的客戶端發送數據,怎麼做比較好一些?

我最初的想法是每建立一個連接就新建一個線程不停的循環,並判斷是否到了特殊時間,不過這樣應該會很吃資源。

於是想到既然建立了連接,那麼程序內部本身應該有一個循環等待接受客戶機消息,如果加在這裡應該會比較合適吧?

奈何水平不夠,不知道這個地方在哪兒,或者這種想法從原理上就是錯誤的,所以想問問大家有沒有什麼好的辦法


如果你用的socket包里的那些阻塞介面,當然寫個線程循環監測時間也沒啥,只不過記得在循環內加上個sleep,哪怕是1ms甚至1us的sleep都可以避免CPU被消耗乾淨。

如果你所說的接收是死循環式里跑socket.recv,它會在recv里阻塞,按你的說法3分鐘一個心跳包,時間檢測就成了3分鐘一次,不太合適。

更好的辦法自然是通過epoll/poll之類的方式或者asyncio/twisted/tornado之類的非同步回調/協程加時間事件甚至是各種GUI框架的事件循環來啟動你的發送和接收。考慮到以後可能有多設備,顯然利用這些成型的玩意更合理。


如果沒有理解錯你的需求的話,你這個應該用websocket 來實現。

請參考

Python之websocket web模擬tail -F

https://zhuanlan.zhihu.com/p/21639702


如果設備能支持websocket,可以考慮用 Web Application Messaging Protocol 這個協議提供的庫來實現這種功能。如果設備端實現不了,也可以只在服務端使用裡面的Crossbar.io 註冊和管理設備的相關事件來實現你需要的功能。


推薦閱讀:

從這個問題「class 'bs4.element.Tag'是什麼類型」 展開說明。
Python能做什麼?需要什麼學習前提知識,如果要找工作,還需要學習什麼知識?
Python爬蟲實戰——免費圖片 - Pixabay
給妹子講python--17函數的基本特徵
如何零基礎自學入門Python

TAG:Python |