Python在套接字中向所有客户端广播消息
我做了一个简单的聊天服务器,使用了线程,代码大概是这样的:
#-*- 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组播(如果你在一个相对可靠的网络上,比如局域网或者公司内部网络),或者你需要明确地把数据发送给每一个连接的客户端。另一种选择是点对点传输:你可以先发送给几个客户端,然后让这些客户端再把数据发送给更多的客户端,直到所有的客户端都收到。这显然需要更多的编码工作。 :)