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

时间:2014-10-14 12:51:30

标签: 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 = 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 :(得分:0)

没有什么比你想要做的更好,因为正如赞扬中指出的那样,sendall()意味着“绝对发送我所有的字节并继续尝试直到你拥有”,而不是“将这些字节发送到批次客户。“

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

答案 1 :(得分:0)

您可以查看Zero MQ,它通过实现多种模式(发布/订阅,推/拉等等)来提供套接字上的高级设施。