我所做的不使用队列,但是我将举例说明发送一条线,一旦建立连接的代码。有大量的打印内容可以帮助你理解正在发生的事情。
常住进口的东西:
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)
您创建线路接收器获得的协议,设置分隔符。 在这种情况下,一旦建立连接,我只需写一个字符串“www”。 关键的一点是看协议接口在twisted.internet.interface.py并理解协议的各种方法和他们做的,当他们叫什么。
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
最后,协议工厂将为每个连接创建一个协议实例。 查看方法: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()
我跑了这一点,它连接到简单的打印它接收和发送,因此没有ACK回一个服务器。这里是输出:
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
上面的例子如果不是容错的话。要重新连接,当连接丢失时,可以从现有的扭曲类派生协议工厂 - 重新连接客户端工厂。 扭曲几乎所有你需要:)
class myProtocolFactory(ReconnectingClientFactory):
protocol = MyProtocol
def buildProtocol(self, address):
print address
return self.protocol()
更多参考
我建议你阅读工具:http://krondo.com/?page_id=1327
[编辑:按照下面的评论]
'basic.LineReceiver.delimiter = “\ n”'?真?真可怕。你有什么对'self.delimiter =“\ n”'?它更短*和*更少疯狂。 – 2010-10-12 18:42:29
@ Jean-Paul Calderone:+1我也在学习。谢谢。我在瞬间写这一点,因此错误 – pyfunc 2010-10-12 18:45:27
这是关于我在我的代码在多大程度上做到了,但我不明白的是在connectionMade方法你有一个函数调用的MyProtocol类。我想有一个异步循环从队列中提取这些值。如果我在连接建立的时候正确理解了你的代码,并且在我完成发送所有排队的消息之前立即断开连接,那么循环将会阻塞或者它会继续,但是会由于连接而丢弃消息走了。我读的是对的吗? – 2010-10-12 19:04:06