【问题标题】:Python: Sending over TCP session established from within a different class/threadPython:通过从不同的类/线程中建立的 TCP 会话发送
【发布时间】:2014-11-18 18:15:48
【问题描述】:

我有一个 python 应用程序,它有两个主要功能。它通过 UDP 侦听器线程从远程源接收流数据(我们称之为“传入数据流”)。

还有一个 TCP 监听线程,它监听来自另一个远程源的命令。协议中实现了各种命令,但我只实现“发送配置数据”(确实如此,并且有效)和 START/STOP 流数据。此开始/停止流数据应将(编码的)“传入数据流”转发给外部 TCP 方。

我是一个 Python 新手,我已经“破解”了我目前所拥有的东西。基本上是两个线程,一个不断接受 UDP 流数据(速率:每秒 10 条消息),另一个监听和处理 TCP 请求。我一直计划这样做的方式是在 TCP 请求启动流数据时设置一个标志,当此标志为 True 时,处理传入 UDP 数据的函数会将格式化的帧发送到已建立的 TCP 会话。

问题:我不知道如何在自己的操作范围之外引用或使用已建立的TCP会话。 IE。从我刚刚使用的线程范围内将配置数据发送到已建立的会话: self.request.sendall(packedConfigFrame)

帮助非常感谢。

参考代码:http://pastebin.com/PbCb59sy

【问题讨论】:

    标签: python multithreading sockets tcp streaming


    【解决方案1】:

    可能想尝试使用deque,创建一个全局变量说

    udpData = collections.deque()
    

    然后将您的 UDP 消息存储到 udpData 中,只要您获得它们。在 TCP 线程中,当您的“TCP 请求流数据”标志为 True 时,调用 udpData,并从中使用数据(您可以随意从队列的两端弹出数据),然后处理 UDP 数据并发送已建立 TCP 会话的格式化帧。

    【讨论】:

    • 好主意。我以前使用过双端队列,并没有想到传入。我的问题是,如果我的 TCP 线程被实例化以处理传入连接,我该如何处理一旦请求该数据将“24/7”流式传输的事实。我不想在“请求处理程序”线程中放置一个循环——因为它还需要监听“停止请求”
    • 我认为您不需要在“请求处理程序”中添加另一个循环。在 Handle 例程中,您的原始代码中有一个“while”循环,当流设置为 True 时,您检查“udpData”中是否有数据,如果有,只需弹出一项并格式化它,并发送它。并且由于该 while 循环一直在运行,因此,如果 steaming 为 True 并且 udpData 有数据,那么它应该正在发送数据。
    • 目前的设置方式;在请求处理程序中,while 循环仅在收到 TCP 请求时进行迭代。
    • 好的,我想我现在更好地理解了你的问题。如果您通过类似 class T1(threading.Thread): def init__(self): threading.Thread.__init__(self, name='T1') self.daemon = True And在每个线程下添加一个“运行”例程,并在 'if __name == 'main':' 下,使用 while 循环,并启动两个线程。 Daemon 设置将确保在有工作要做时触发所需的例程......
    • 我不确定您在“运行例程”中的意思是指线程类的 init 吗?目前我在线程下有'handle(self)'。所以目前 TCP 请求处理程序的“句柄”在进行任何进一步操作之前等待数据:def handle(self): global streaming while True: print("PMU Command Received") data = self.request.recv(1024).strip() response = processC37Message(data) if not response == None: self.request.sendall(response)
    猜你喜欢
    • 2011-06-24
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多