我正在关注关于在 Twisted 中编写客户端/服务器对的教程,位于此处:
http://twistedmatrix.com/documents/current/core/howto/clients.html
我已经为我的客户端和服务器的通信做好了一切工作,系统使用自定义前缀来表示它在“对话”中的距离。它最初发送一个 json 字符串来设置会话,然后逐行发送一个文件。这实际上只是一种锻炼,而不是其他任何东西。
客户端.py:
class ClientProtocol(protocol.Protocol):
def connectionMade(self):
json_string = json.dumps({
'uid':ObjectId(),
'lat':43.78,
'lon':-72.5831
},cls=Encoder)
self.transport.write('OPN|'+json_string)
self.fileObject = open('test.csv')
def sendFile(self):
lineData = self.fileObject.readline()
if lineData != '':
self.transport.write('UPD|')
self.transport.write(lineData)
else:
self.transport.write('EOF|done')
def dataReceived(self,data):
if data in ['ELLO','RECVD']:
self.sendFile()
class ClientFactory(protocol.Factory):
def buildProtocol(self,addr):
return ClientProtocol()
if __name__ == '__main__':
point = TCP4ClientEndpoint(reactor,'localhost',5000)
d = point.connect(ClientFactory())
reactor.run()
服务器:
class TransferProtocol(protocol.Protocol):
ran = 0
def connectionLost(self,reason):
print reason
def connectionMade(self):
self.fileObject = open('output','w')
def dataReceived(self,data):
methods = {'OPN':'open','UPD':'upload','EOF':'endfile'}
if data[0:3] in methods.keys():
func = getattr(self,methods[data[0:3]])
func(data[4:])
def open(self,data):
print 'OPEN %s' % data
self.transport.write('ELLO')
def endfile(self,data):
print 'END %s' % data
self.transport.loseConnection()
def upload(self,data):
self.ran+=1
self.fileObject.write(data)
self.transport.write('RECVD')
class myProtocolFactory(protocol.Factory):
protocol = TransferProtocol
def doStart(self):
pass
def startedConnecting(self, connectorInstance):
print connectorInstance
def buildProtocol(self, address):
print address
return self.protocol()
def clientConnectionLost(self, connection, reason):
print reason
print connection
def clientConnectionFailed(self, connection, reason):
print connection
print reason
def doStop(self):
pass
if __name__ == '__main__':
reactor.listenTCP(5000, myProtocolFactory())
reactor.run()
目前,我在一个终端上运行服务器,在另一个终端上运行客户端。正如预期的那样,两个反应器都启动并通信一次,客户端传输它的身份 json,然后是文件内容,然后终止连接。我无法理解的是如何将此协议“连接”到cmd
接口之类的东西,以使其在结束后根据命令生成这些进程。因为客户端中的reactor无限运行,它执行一次网络会话,然后在reactor中不断循环。
我曾经用 Twisted、客户端或服务器构建的所有东西,都只是响应网络调用,所以我想知道什么是正确的方法来使它成为一个“一次性”客户端协议,该协议将在来自cmd
. 甚至有人会将反应堆用于这样的事情吗?或者完全扭曲,而不是仅仅手动打开遵循协议的套接字?
编辑
我在 google 和 SO 上发现了 Twisted stdio 库,但我无法将终端输入协议连接到网络协议。
我有终端协议继承LineReceiver
,提示正确显示。我已将网络工厂分配给终端协议的factory
对象,然后尝试从提示符调用网络协议的方法。问题是,分配给此属性的连接器对象不使用它应该创建的协议的任何方法。
为了简洁起见,我把它放在了 GitHub 上:
https://github.com/DeaconDesperado/swfty-share/blob/master/client.py