一次同时处理 TCP 和 UDP 的扭曲协议
Twisted protocol that simultaneously handles TCP and UDP at once
考虑到我的逻辑,我想做的事情与我选择的传输方式无关 - 我希望 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 使用 相同的 协议;你需要一个 UDP 版本和一个 TCP 版本。
考虑到我的逻辑,我想做的事情与我选择的传输方式无关 - 我希望 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 使用 相同的 协议;你需要一个 UDP 版本和一个 TCP 版本。