Skip to main content
 首页 » 编程设计

python之用于允许断开连接的仅发送协议(protocol)的扭曲客户端

2025年05月04日11lautakyan007

我决定在 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

[编辑:根据下面的评论]