socket server Python 服务端如何主动发送消息?

2019-05-23 11:56:40 +08:00
 woshichuanqilz

我查看了这里的资料, 看到 server 发送消息都是在 handle 里面也就是说要先有客户端有消息发送过来才会做出对应的发送消息的动作, 那么如果我想在服务端主动的发送消息给客户端这个应该怎么做? https://docs.python.org/3/library/socketserver.html#socketserver.BaseServer.server_bind

这个是实例代码, 这个 handle 里面处理了消息发送的过程。

import socketserver

class MyUDPHandler(socketserver.BaseRequestHandler):
    """
    This class works similar to the TCP handler class, except that
    self.request consists of a pair of data and client socket, and since
    there is no connection the client address must be given explicitly
    when sending data back via sendto().
    """

    def handle(self):
        data = self.request[0].strip()
        socket = self.request[1]
        print("{} wrote:".format(self.client_address[0]))
        print(data)
        socket.sendto(data.upper(), self.client_address)

if __name__ == "__main__":
    HOST, PORT = "localhost", 9999
    with socketserver.UDPServer((HOST, PORT), MyUDPHandler) as server:
        server.serve_forever()

2364 次点击
所在节点    Python
3 条回复
prim
2019-05-23 12:15:54 +08:00
建议你看看 TCP
如果非要用 UDP 的话,你就可以在第一次收到这个 client address 的时候把这个 socket 和 address 存起来
你想在哪里主动发数据的话就再用前面记录下来的 socket 和 address

如果你是想在 client 没有发包过来的时候就发包给他
那么你把这个 client 实现成你代码里面的 UDPServer 就好了,这样你就能提前这个 client address
xomix
2019-05-23 13:00:51 +08:00
这是一个很常见的问题,百度关键字 udp 打洞。
至于怎么做你自己百度吧。
julyclyde
2019-05-23 14:11:44 +08:00
socketserver 里对于 TCP 协议,所谓“消息”是指一个连接
对于 UDP 协议,当然必须先收到消息才能确定角色。如果没收到就发,那叫客户端不叫服务器

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/566903

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX