亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Python TCPServer 編程遇到的問題

Python TCPServer 編程遇到的問題

一只名叫tom的貓 2019-04-16 20:26:51
我在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有選擇的回復。這個如何操作?關于如何保存數據這塊,如果有人知道就更好了,但這個問題是其次的,上面的兩個問題很重要。我想參考一些代碼,看有沒有這方面的例子,如果有人能提供更好了,我上網查了不少代碼,關于這方面的還是不多。而且大多數就建立一個測試的例子,和我這兒的需求不太一樣。
查看完整描述

2 回答

?
忽然笑

TA貢獻1806條經驗 獲得超5個贊

不太了解gevent,但是TwistedSocketServer的做法是使用Factory,需要持久化的放在Factory,這樣所有的DeviceID,SNR都可以查得到。尤其使用LongpullTCPconnections的話,直接發給對方就好了。
不過既然分為Client/Server模式,那么Server就應該聽為主,盡量不要自己去Push,讓Client來Pull就好了。
不過Twisted比較難調試。Tornado也是如此。如果涉及到SQLDB和NoSQLDB操作,需要仔細編寫代碼。
不過我現在完成了基本的框架,下一步準備加上CoAP和TLS。其中CoAP也可以解決Push的需求。
                            
查看完整回答
反對 回復 2019-04-16
  • 2 回答
  • 0 關注
  • 367 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號