我决定在 twisted 的帮助下涉足异步 python 的世界。我已经实现了文档中的一些示例,但我很难找到我正在尝试编写的非常简单的客户端示例。
简而言之,我想要一个与服务器建立 tcp 连接的客户端,然后从队列对象向服务器发送简单的“\n”终止字符串消息。服务器永远不会响应任何消息,因此我的客户端是完全单向的。我/认为/我想要的是 this example 的某种组合和 twisted.internet.protocols.basic.LineReceiver 便利协议(protocol)。感觉这应该是一个人可以在扭曲中做的最简单的事情,但我在网上看到的文档或示例似乎都不太合适。
请您参考如下方法:
我所做的不是使用队列,而是说明在建立连接后发送线路的代码。有大量打印资料可以帮助您了解正在发生的事情。
通常的导入内容:
from twisted.web import proxy
from twisted.internet import reactor
from twisted.internet import protocol
from twisted.internet.protocol import ReconnectingClientFactory
from twisted.protocols import basic
from twisted.python import log
import sys
log.startLogging(sys.stdout)
您创建一个从行接收器派生的协议(protocol),设置分隔符。 在这种情况下,一旦建立连接,我就简单地写一个字符串“www”。 关键是查看 twisted.internet.interface.py 上的协议(protocol)接口(interface),了解协议(protocol)的各种方法以及它们的作用和调用时间。
class MyProtocol(basic.LineReceiver):
#def makeConnection(self, transport):
# print transport
def connectionLost(self, reason):
print reason
self.sendData = False
def connectionMade(self):
print "connection made"
self.delimiter = "\n"
self.sendData = True
print self.transport
self.sendFromQueue()
def sendFromQueue(self):
while self.sendData:
msg = dataQueue.get()
self.sendLine(msg)
# you need to handle empty queue
# Have another function to resume
最后,一个协议(protocol)工厂将为每个连接创建一个协议(protocol)实例。 查看方法:buildProtcol。
class myProtocolFactory():
protocol = MyProtocol
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
现在您使用连接器进行连接:
reactor.connectTCP('localhost', 50000, myProtocolFactory())
reactor.run()
我运行了这个并将它连接到一个服务器,该服务器只打印它接收到的内容,因此不发送任何确认。这是输出:
1286906080.08 82 INFO 140735087148064 __main__ conn_made: client_address=127.0.0.1:50277
1286906080.08 83 DEBUG 140735087148064 __main__ created handler; waiting for loop
1286906080.08 83 DEBUG 140735087148064 __main__ handle_read
1286906080.08 83 DEBUG 140735087148064 __main__ after recv
'www\n'
Recieved: 4
上面的例子如果不是容错的。要重新连接,当连接丢失时,您可以从现有的扭曲类 - ReconnectingClientFactory 派生协议(protocol)工厂。 Twisted 几乎拥有您需要的所有工具:)
class myProtocolFactory(ReconnectingClientFactory):
protocol = MyProtocol
def buildProtocol(self, address):
print address
return self.protocol()
For further reference
我建议您阅读:http://krondo.com/?page_id=1327
[编辑:根据下面的评论]
