python - 同时处理 TCP 和 UDP 的 Twisted 协议(protocol)

标签 python python-2.7 tcp udp twisted

考虑到我的逻辑,我想要做的事情与我选择的传输方式无关 - 我希望 UDP 和 TCP 能够工作。通常,如果我使用 TCP 或 SSL——这有点微不足道。然而,对于UDP(无工厂)和TCP(使用工厂),它变得有点棘手?

from twisted.internet.protocol import Factory, ServerFactory, Protocol, DatagramProtocol
from twisted.internet import reactor

class SpecialServerProtocol(DatagramProtocol, Protocol):
  def datagramReceived(self, datagram, address):
    print("Received udp")
    self.transport.write(datagram, address)

  def dataReceived(self, data):
    print("Received tcp")
    self.transport.write(data)

class SpecialServerFactory(ServerFactory):
  protocol = IPBusServerProtocol

def main():
  reactor.listenTCP(8000, SpecialServerFactory())
  reactor.listenUDP(8000, SpecialServerProtocol())

  reactor.run()

if __name__ == '__main__':
  main()

这是我设法获得的一些代码,它似乎按预期工作(我认为)。我不清楚这是否真的是一件好事,或者我是否应该从 TCP/UDP 中分离出相同的逻辑并将其传递给一系列独立于它们如何调用的函数。

最佳答案

TCP 是面向连接的,这意味着您会收到连接开始、数据到达以及连接结束的通知。 UDP 不是;您只是从各个对等点获取大量数据,这些数据可能随时出现或消失,而不会发出任何通知。因此,您不能通过 TCP 和 UDP 使用相同协议(protocol);您需要一个 UDP 版本和一个 TCP 版本。

关于python - 同时处理 TCP 和 UDP 的 Twisted 协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33224142/

相关文章:

Python套接字发送在多次调用recv后不起作用

python - 无法使用 ChoiceField 检查表单值

linux - 从源代码自定义编译 Apache Server

python - 如何计算 python 中两个不同列表中的元素?

python - 如何使用 plt.savefig 正确显示足够的刻度标记?

python - 从 scrapy 请求打印 'response'

Python:为什么引用列表的变量范围不同于引用任何其他数据结构或数据类型的变量?

python - 从 Python 执行 PowerShell 脚本的最佳方式是什么

tcp - 如何为多个消费者重用服务器端 TCP 端点?

c++ - 读取 Windows 套接字上的 SIO_KEEPALIVE_VALS 字段(用于保持空闲和间隔时间)