2010-10-12 60 views
2

我已经决定动用我的脚趾与扭曲的帮助异步蟒蛇的世界。我已经实现了文档中的一些示例,但我很难找到一个非常简单的客户端示例,我试图编写它。扭曲的客户端发送一个唯一的协议,是宽容断开

总之我想的客户机,其建立与服务器的TCP连接,然后发送简单的“\ n”个终止的字符串的消息关闭一个队列对象到服务器的。服务器不会回应任何消息,因此我的客户端完全是单向的。我/想/我想要的是this example和twisted.internet.protocols.basic.LineReceiver便捷协议的组合。这感觉应该是人们可以做的最简单的事情,但没有任何我在网上看到的文档或例子似乎很合适。

回答

1

我所做的不使用队列,但是我将举例说明发送一条线,一旦建立连接的代码。有大量的打印内容可以帮助你理解正在发生的事情。

常住进口的东西:

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

[编辑:按照下面的评论]

+2

'basic.LineReceiver.delimiter = “\ n”'?真?真可怕。你有什么对'self.delimiter =“\ n”'?它更短*和*更少疯狂。 – 2010-10-12 18:42:29

+1

@ Jean-Paul Calderone:+1我也在学习。谢谢。我在瞬间写这一点,因此错误 – pyfunc 2010-10-12 18:45:27

+0

这是关于我在我的代码在多大程度上做到了,但我不明白的是在connectionMade方法你有一个函数调用的MyProtocol类。我想有一个异步循环从队列中提取这些值。如果我在连接建立的时候正确理解了你的代码,并且在我完成发送所有排队的消息之前立即断开连接,那么循环将会阻塞或者它会继续,但是会由于连接而丢弃消息走了。我读的是对的吗? – 2010-10-12 19:04:06