Python 异步与 UDP

Python asyncore with UDP

我可以在 asyncore 中编写 UDP client/server 应用程序吗?我已经使用 TCP 编写了一个。我的愿望是将它与对 UDP 的支持集成在一起。

我的问题之前 asked/answered 不是以下问题: Python asyncore UDP server

经过长时间的搜索,答案是。 Asyncore 假定底层套接字是 connection-oriented,即 TCP。

是的,你可以。这是一个简单的例子:

class AsyncoreSocketUDP(asyncore.dispatcher):

  def __init__(self, port=0):
    asyncore.dispatcher.__init__(self)
    self.create_socket(socket.AF_INET, socket.SOCK_DGRAM)
    self.bind(('', port))

  # This is called every time there is something to read
  def handle_read(self):
    data, addr = self.recvfrom(2048)
    # ... do something here, eg self.sendto(data, (addr, port))

  def writable(self): 
    return False # don't want write notifies

这应该足以让您入门。查看 asyncore 模块以获得更多想法。

小注:asyncore.dispatcher 将套接字设置为非阻塞。如果 你想快速写入大量数据到套接字而不引起 错误你必须做一些依赖于应用程序的缓冲 ala asyncore.dispatcher_with_send.

感谢这里的(稍微不准确的)代码让我开始: https://www.panda3d.org/forums/viewtopic.php?t=9364

您好,感谢 @bw1024 指出了正确的方向,我将根据您的 pandas 和 python asyncore 文档添加我的解决方案。

我的用例是从 UDP 流

中捕获一些 JSON

`

导入套接字 导入 json 导入异步

UDP_IP = '127.0.0.1' UDP_PORT = 2000

class AsyncUDPClient(asyncore.dispatcher): def init(self, host, port): asyncore.dispatcher.初始化(self) self.create_socket(socket.AF_INET, socket.SOCK_DGRAM) self.bind((主机, 端口)) print("connecting.. host = '{0}'' port = '{1}'" .format(host, str(port)))

def handle_connect(self):
    print("connected")


def handle_read(self):
    data = self.recv(1024)
    y = json.loads(data)
    print("PM 2.5 ug/m^3 async : %s "% y['PM25MassPerM3'])

def writable(self):
    return False;

client = AsyncUDPClient(UDP_IP, UDP_PORT)

asyncore.loop()

`

P.S 不确定为什么代码在 python 上的 运行 格式不正确 3.6.9 OK 这是 link 要点