Python asyncore UDP 服务器

1 投票
1 回答
2052 浏览
提问于 2025-04-18 05:06

我正在用Python写一个服务器应用,它可以接收请求、处理请求,然后发送响应。

所有的请求和响应都是从同一个地址和端口发送到这个服务器应用的。我需要同时接收和发送消息,而且服务器需要从同一个端口和地址接收和发送消息。我找到了一些关于异步套接字的教程,但那些例子都是针对TCP连接的。

可惜的是,我需要用UDP。当我在创建方法中把SOCK_STREAM改成SOCK_DGRAM时,就出现了错误。

return getattr(self._sock,name)(*args)
socket.error: [Errno 95] Operation not supported

我尝试使用twisted库,但我不知道怎么写发送部分,以便它可以绑定到和监听相同的端口。最后的结果是端口被阻塞了。

有没有办法用异步套接字处理UDP,或者如何使用twisted从同一个端口发送消息?如果能提供一些例子,那就太好了。

1 个回答

2

你基本上只需要写好发送和接收的代码,它们就能一起工作。要注意的是,你可以在一个监听的UDP套接字上同时发送和接收数据——你不需要为每个操作都准备一个套接字(特别是当你想要从同一个地址发送和接收时)。

from __future__ import print_function

from sys import stdout

from twisted.python.log import startLogging
from twisted.internet import reactor
from twisted.internet.protocol import DatagramProtocol

class SomeUDP(DatagramProtocol):
    def datagramReceived(self, datagram, address):
        print(u"Got a datagram of {} bytes.".format(len(datagram)))

    def sendFoo(self, foo, ip, port):
        self.transport.write(
            (u"Foo datagram: {}".format(foo)).encode("utf-8"),
            (ip, port))

class SomeSender(object):
    def __init__(self, proto):
        self.proto = proto

    def start(self):
        reactor.callLater(3, self._send)

    def _send(self):
        self.proto.sendFoo(u"Hello or whatever", b"127.0.0.1", 12345)
        self.start()

startLogging(stdout)

proto = SomeUDP()
reactor.listenUDP(12345, proto)

SomeSender(proto).start()

reactor.run()

撰写回答