我在v2ex上提了一個問題:用Python寫了一個簡單的TCPServer,放到一臺Linux服務器上,目前可以從設備通過TCP連接接收十六進制消息.我的最終目的是使得TCPServer能夠接收上萬臺設備發來的十六進制消息,然后解析并存到數據庫里。當然目前僅僅需要接收幾臺設備的信息,但現在遇到了一些問題:(設備都用DTU代替,放在服務器上的腳本用DSC代替)1、當多個DTU向DSC建立鏈接并發送數據包時,需要把當前連接保存起來,并最好有一個序號,保存到dtu_list中。當該連接斷開時可以從dtu_list中根據序號刪除。http://www.v2ex.com/t/154857#reply25下面也有人回答了,我用這個項目的源碼已經實現了部分功能,包括服務器的建立,還能保存數據,但我是直接用pymysql直接在process_message保存的。https://github.com/34nm/gsmtpd但是還是有問題需要解決:1、雖然可以建立服務器,比如使用下面的代碼pythonfromgeventimportmonkeymonkey.patch_all()fromgsmtpd.serverimportSMTPServerclassDebuggingServer(SMTPServer):#Dosomethingwiththegatheredmessagedefprocess_message(self,peer,mailfrom,rcpttos,data):inheaders=1lines=data.split('\n')print'----------MESSAGEFOLLOWS----------'forlineinlines:#headersfirstifinheadersandnotline:print'X-Peer:',peer[0]inheaders=0printline#我在這兒直接保存line到數據庫,使用的pymysqlprint'------------ENDMESSAGE------------'if__name__=="__main__":server=DebuggingServer()server.serve_forever()#以下的代碼是無法執行的1、但是server.serve_forever()下的代碼是無法執行的,服務器建立了(bind),還是需要一些操作的,比如我需要服務器主動發送一些數據到客戶端去操作一些指令,那應該如何組織代碼呢?(可以這樣了解在linux下執行server.py,轉入后臺運行,然后我還想主動操作server,我再執行server.pyoptionvalue時,是另執行一個進程,如何解決呢?)2、每次客戶端發起的連接我都需要保存起來,因為服務器主動發送數據時,一定需要根據客戶端的id有選擇的回復。這個如何操作?關于如何保存數據這塊,如果有人知道就更好了,但這個問題是其次的,上面的兩個問題很重要。我想參考一些代碼,看有沒有這方面的例子,如果有人能提供更好了,我上網查了不少代碼,關于這方面的還是不多。而且大多數就建立一個測試的例子,和我這兒的需求不太一樣。
Python TCPServer 編程遇到的問題
一只名叫tom的貓
2019-04-16 20:26:51