求熟悉Twisted底層的大神幫助。我的TCP端口服務(wù)器一直服務(wù)正常,可是一旦加入Redis之后,卻不再返回?cái)?shù)據(jù)了?classPlainTCP(protocol.Protocol):def__init__(self,factory):passdefconnectionMade(self):self.factory.numConnections+=1print"Nr.ofconnections:%d\n"%(self.factory.numConnections)self.transport.write("Helloremote\r\n")defconnectionLost(self,reason):self.factory.numConnections-=1print"Nr.ofconnections:%d\n"%(self.factory.numConnections)defdataReceived(self,data):(self.snrCode,rDat,pDat)=getDataParsed(data)self.transport.write(data)以上代碼在遠(yuǎn)程客戶(hù)端可以立即獲得復(fù)制的數(shù)據(jù)而增加了SQL/Redis數(shù)據(jù)保存后,事情變得奇怪了。#!/usr/bin/envpythonimporttimeimportbinasciiimporttxredisapifromtwisted.internetimportdeferfromtwisted.internetimportprotocol,reactorfromtwisted.internet.protocolimportFactoryfromtwisted.enterpriseimportadbapifromtwisted.pythonimportlogfromdmpackimportDmpackfromdmdbimportDmdbfromdmconfigimportDmConfdm=Dmpack()conf=DmConf().loadConf()rcs=txredisapi.lazyConnection(password=conf['RedisPassword'])dbpool=adbapi.ConnectionPool("MySQLdb",db=conf['DbName'],user=conf['DbAccount'],\passwd=conf['DbPassword'],host=conf['DbHost'],\use_unicode=True,charset=conf['DbCharset'])defgetDataParsed(data):realtime=Noneperiod=NonesnrCode=dm.snrToAscii(data[2:7])realtime=data[7:167]perid=data[167:-2]return(snrCode,realtime,period)classPlainTCP(protocol.Protocol):def__init__(self,factory):self.factory=factoryself.factory.numConnections=0self.snrCode=Noneself.rData=Noneself.pData=Noneself.err=NonedefconnectionMade(self):self.factory.numConnections+=1print"Nr.ofconnections:%d\n"%(self.factory.numConnections)self.transport.write("Helloremote\r\n")##這里也不返回?cái)?shù)據(jù)了defconnectionLost(self,reason):self.factory.numConnections-=1print"Nr.ofconnections:%d\n"%(self.factory.numConnections)@defer.inlineCallbacksdefdataReceived(self,data):globaldbpool,rcs(self.snrCode,rDat,pDat)=getDataParsed(data)ifself.snrCode==NoneorrDat==NoneorpDat==None:err="Badformat"else:err="OK"print"err:%s"%(err)###這里可以在終端打印數(shù)據(jù)self.err=errself.transport.write(self.snrCode)###沒(méi)有數(shù)據(jù)返回self.transport.write(self.err)self.transport.write(rDat)self.transport.write(pDat)self.transport.loseConnection()ifself.snrCode!=NoneandrDat!=NoneandpDat!=None:res=yieldself.saveRealTimeData(rcs,rDat)res=yieldself.savePeriodData(dbpool,pDat,conf)print"err2:%s"%(err)###終端有打印@defer.inlineCallbacksdefsaveRealTimeData(self,rc,dat):yieldrc.set(key,val)###自己腦補(bǔ)Key、Valyieldrc.expire(key,30)###可以保存,已經(jīng)確認(rèn)@defer.inlineCallbacksdefsavePeriodData(self,rc,dat,conf):query="insert....."###自己腦補(bǔ)SQLyieldrc.runQuery(query)###可以保存,已經(jīng)確認(rèn)classPlainTCPFactory(protocol.Factory):defbuildProtocol(self,addr):returnPlainTCP(self)defmain():dmdb=Dmdb()ifnotdmdb.detectDb():print"PleaserunMySQLRDBSfirst."sys.exit()log.startLogging(sys.stdout)reactor.listenTCP(8080,PlainTCPFactory())reactor.run()if__name__=="__main__":main()現(xiàn)象是一旦加入了異步庫(kù)之后,socket就不在回傳了。原始Demo中self.transport.write()沒(méi)有任何修飾符,所以這應(yīng)該是同步的。搞不懂異步數(shù)據(jù)庫(kù)加入后,為何連connectionMade()這個(gè)不相關(guān)的句柄中的write()也被失效了。而同時(shí)print卻是有效的?
Twisted TCP Server無(wú)法回送數(shù)據(jù)
德瑪西亞99
2019-04-19 16:29:33