Skip to main content
 首页 » 编程设计

python twisted 从一个套接字读取,写入另一个套接字

2025年05月04日9dflying

因此,我找到了许多使用 Twisted 创建多个同时客户端连接的示例,以及如何支持多个协议(protocol)以及如何遍历多个客户端 (http://twistedmatrix.com/trac/wiki/FrequentlyAskedQuestions#HowdoImakeinputononeconnectionresultinoutputonanother),但我正在寻找的是代码片段演示了如何从监听器套接字读取数据,进行一些操作,然后通过客户端套接字将其写出。

我知道我很接近,我只是还没有确定模式。

明确地说,我想从端口 9000 读取一行 -> 传递给工厂 -> 运行算法 -> 将端口 9001 写出到不同的进程。

class ClientSideProtocol(basic.LineReceiver): 
    def __init__(self, factory): 
            self.factory = factory 
 
def connectionMade(self): 
    print "Made Connection to JoaC" 
 
def connectionLost(self, reason): 
    print "Lost Connection to JoaC" 
 
def lineReceived(self, line): 
    self.sendline(self.factory.tb.runAlgo(line)) 
 
 
class EmulatorFactory(protocol.ClientFactory): 
def __init__(self, sensorName): 
    self.tb = tbg2(sensorName) 
 
def startedConnecting(self,connector): 
    print "Started to connect." 
 
def buildProtocol(self, addr): 
    print "buildProtocol called" 
    return ClientSideProtocol(self) 
 
def clientConnectionLost(self, connector, reason): 
    print 'Lost connection.  Reason:', reason 
 
def clientConnectionFailed(self, connector, reason): 
    print 'Connection failed. Reason:', reason 
 
def main(): 
sensorName = "Test1" 
mystuff = EmulatorFactory(sensorName) 
reactor.listenTCP(9000, mystuff) 
reactor.connectTCP(host = "localhost", port = 9001, factory = mystuff, timeout = 5) 
reactor.run() 

这就是我到目前为止的大致情况,我在球场上吗?

请您参考如下方法:

您为客户端和服务器使用同一个工厂。这意味着当数据从客户端连接到达您的服务器或从您连接到的远程服务器的客户端连接到达时,您将很难做正确的事情。它们都将被交付给由同一个工厂实例创建的同一种协议(protocol)。您将如何决定如何处理数据?

我建议改用两个不同的工厂,可能还有两个不同的协议(protocol)。

接下来,这些行没有实现您想要的行为:

def lineReceived(self, line): 
    self.sendline(self.factory.tb.runAlgo(line)) 

这接受从连接的远程端接收到的数据,通过 runAlgo 传递它,然后将 runAlgo 的结果发送回连接的远程端。它不会将其传递给其他连接。你可以看出这是同一个连接,因为 self 被传递给 lineReceived,告诉你在哪个协议(protocol)实例(以及哪个连接)上接收到该行。然后代码使用完全相同的 self 发送一条线 - 将其发送回同一连接。如果要将其发送到不同的连接,则需要在不同的协议(protocol)实例上调用 sendLine。