将数据发送到从不同工厂接收的多个工厂[关闭]

Posted

技术标签:

【中文标题】将数据发送到从不同工厂接收的多个工厂[关闭]【英文标题】:sending data to multiple factories receieved from a different factory [closed] 【发布时间】:2014-05-07 18:35:34 【问题描述】:

有一个similar question here,但没有明确的答案。

我需要能够在一个端口 (9000) 上侦听,并通过不同的端口 (7777,8888,9999) 发送到其他服务器。

我编写的代码确实有效,但我不确定它是否是最好的方法。继续使用self.factory.factoryObjectList 看起来不是pythonic。我希望我可以将其分配给另一个值以稍微清理代码。

我的方法是否矫枉过正?这可以用更简单的方式完成吗?

import sys
from twisted.internet import reactor
from twisted.internet.protocol import Protocol, ClientFactory, ServerFactory
from twisted.protocols.basic import LineReceiver
from twisted.python import log

class RX_Protocol(LineReceiver):

    def dataReceived(self, data):
        self.sendMessageToConnections(self.factory.factoryObjectList, data)
        self.transport.write('sent \'%s\' to %d servers\n' % (data.strip(), self.countConnections(self.factory.factoryObjectList)))

    def connectionMade(self):
        self.transport.write('hello telnet user! Let\'s send a message to all connections\n')

    def sendMessageToConnections(self, factoryObjectList, data):
        for factoryObject in factoryObjectList:  # iterate through list of factory objects, 1 for each server
            for connection in factoryObject.factory.connections:  # now iterate through the actual connections of each factory
                connection.transport.write(data)

    def countConnections(self, factoryObjectList):
        counter = 0
        for factoryObject in factoryObjectList:
            if factoryObject.state == 'connected':
                counter += 1
        return counter


class RX_Factory(ServerFactory):
    protocol = RX_Protocol

    def __init__(self, factoryObjectList):
        self.factoryObjectList = factoryObjectList


## TX Stuff ##
class TX_Protocol(Protocol):

    def connectionMade(self):
        self.factory.connections.append(self)

    def connectionLost(self, reason):
        self.factory.connections.remove(self)


class TX_Factory(ClientFactory):  # subclass your factory of choice (Factory, ClientFactory, ServerFactory)
    protocol = TX_Protocol

    def __init__(self):
        self.connections = []

# spawn these in new terminals using nc -l XXXX
servers = [('localhost', 7777),
           ('localhost', 8888),
           ('localhost', 9999)]
# servers = [('localhost', 7777)]  # easier than opening 3 terminals

factoryObjectList = []  # will hold the multiple factories we use to connect to servers

# give us better STDOUT twisted logging
log.startLogging(sys.stdout)

for host, port in servers:
    factoryObjectList.append(reactor.connectTCP(host, port, TX_Factory()))

reactor.listenTCP(9000, RX_Factory(factoryObjectList))  #RX_Factory now "knows" about connections to servers
reactor.run()

【问题讨论】:

“non-pythonic”、“overkill”、“clean up”都是描述问题的模糊、主观的方式。用代码描述你认为实际上错误的地方,否则你不太可能得到告诉你如何做正确事情的答案。 这个问题似乎是题外话,因为它是关于工作代码 - 它可能应该迁移到codereview.stackexchange.com 感谢您的反馈。应该更清楚。非常新的异步代码和扭曲。 【参考方案1】:

你的方法在我看来很典型。

看看 SO:What is the correct way to access a protocols transport in Twisted?(它也链接到另一个 SO:Persistent connection in Twisted)有一个关于新的“端点”系统的注释,你可能更喜欢它的风格。

【讨论】:

以上是关于将数据发送到从不同工厂接收的多个工厂[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

将多个参数从控制器传递到工厂服务进行 REST 调用并返回(可选)数据

如何从 azure blob 存储中获取 json 数据并使用 azure 数据工厂将其发送到 power apps dataverse

使用 Azure 数据工厂 (ADF) 数据流 (DF) 从/向 Azure Data Lake Store gen1 发送和接收数据

如何在 Wear OS 智能手表和 Windows PC 之间发送和接收数据

在 Azure 数据工厂中成功完成数据流后,为啥没有将数据传输到我的接收器表?

Azure 数据工厂将数据流映射到 CSV 接收器导致零字节文件