Python在套接字中向所有客户端广播消息

1 投票
2 回答
2354 浏览
提问于 2025-04-27 12:09

我做了一个简单的聊天服务器,使用了线程,代码大概是这样的:

#-*- coding:utf-8 -*-

import _thread as thread
import time
import socket
def now():
    return time.asctime(time.localtime())

def handleclient(connection, ADDR):
    sod = str(ADDR)
    msg = sod+"joined the chat"
    msg2 = msg.encode("utf-8")
    connection.sendall(msg2)
    while True:

        recieved = connection.recv(1024)
        adsf = recieved.decode("utf-8")

        print(now(),"(%s):%s" % (ADDR, recieved))
        output = "%s:%s"%(ADDR, recieved.decode("utf-8"))
        message = output.encode("utf-8")
        connection.sendall(message)




if __name__ == "__main__":
    addr = ("", 8080)
    r =socket.socket()
    print("socket object created at", now())
    r.bind(addr)
    r.listen(5)

    while True:
        print("Waiting for clients...")
        connection, ADDR = r.accept()
        print("We have connection from ", ADDR)

        thread.start_new_thread(handleclient, (connection, ADDR))

不过,似乎sendall这个功能没有正常工作,它只把消息发给了发送消息的人。请问我该如何让它把消息发给所有的客户端呢?

暂无标签

2 个回答

0

你可以看看 Zero MQ,它在网络连接的基础上提供了一些高级功能,支持多种通信模式,比如发布/订阅、推送/拉取等等。

0

你想做的事情没有现成的解决方案,因为正如评论中提到的,sendall() 的意思是“一定要发送我所有的数据,并且会一直尝试直到发送完”,而不是“把这些数据发送给很多客户端”。

你可以选择使用UDP组播(如果你在一个相对可靠的网络上,比如局域网或者公司内部网络),或者你需要明确地把数据发送给每一个连接的客户端。另一种选择是点对点传输:你可以先发送给几个客户端,然后让这些客户端再把数据发送给更多的客户端,直到所有的客户端都收到。这显然需要更多的编码工作。 :)

撰写回答