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

Python向套接字中的所有客户端广播消息,python,sockets,Python,Sockets,我使用如下线程制作了一个简单的聊天服务器: #-*- 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 = m

我使用如下线程制作了一个简单的聊天服务器:

#-*- 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
似乎不起作用,只向发送消息的人发送消息。如何让它发送到所有客户端?

这与您正在尝试的操作完全不同,因为正如推荐中所指出的,
sendall()
的意思是“一定要发送我所有的字节,并一直尝试,直到有了为止”,而不是“将这些字节发送到许多客户端”


您将希望使用UDP多播(如果您在一个支持它的相对可靠的网络上,例如LAN或公司WAN),或者只需要显式地发送到每个连接的客户端。另一种选择是点对点:发送到多个客户机,并指示这些客户机发送到更多客户机,直到处理完所有客户机。显然,这需要更多的编码。:)

您可以看一看,它通过实现几种模式(发布/订阅、推/拉等)在套接字上提供高级功能。

这不是它的功能。你被它的名字弄糊涂了。@Ashwini Chaudhary噢。这和我想做的完全不同。有什么解决方案吗?您必须在此处、列表或字典中跟踪连接对象,并在连接丢失后将其删除。但这将是棘手的,因为其中涉及线程。也就是说,我个人更喜欢套接字,它比线程方式更易于使用和维护。Twisted中的简单chatserver示例:从外观上看,我的线程、解决方案、代码可能会有所帮助。