我正在努力使用客户端/服务器设置的 .sendall() 方法。多个客户端可以单独连接并向服务器发送消息并获得回显响应。但是,我希望发送的消息在类似聊天的环境中显示给所有连接的客户端。
这是在服务器应用程序上运行的代码。
def clientHandler(conn, addr):
name = addr[0]
print(addr, " connected to the server")
while True:
data = conn.recv(1024)
if tostr(data)[0:5] == '/name':
print('setting name')
setname(data)
if not data:
break
conn.sendall(str.encode(checkname(addr[0]) + tostr(data)))
print('Received Message: ', tostr(data))
HOST = '' #LOCALHOST
PORT = 1400
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind((HOST, PORT))
sock.listen(999999)
print('Server is running' + '-'*10)
for i in range(999999):
conn, addr = sock.accept()
Thread(target = clientHandler, args = (conn, addr)).start()
sock.close()
提前致谢
最佳答案
正如我最初在评论中所说(但现在决定最好在答案中说),sendall
将所有字节发送到一个单个 连接。您需要添加如下内容:
lock = threading.Lock()
all_clients = []
在顶部;在主循环中,您现在只有 conn, addr = sock.accept()
, have
conn, addr = sock.accept()
with lock:
all_clients.append(conn)
在 clientHandler
中,您现在只有 conn.sendall(str.encode(checkname(addr[0]) + tostr(data)))
,而有
with lock:
for c in all_clients:
c.sendall(str.encode(checkname(addr[0]) + tostr(data)))
IOW,您需要在服务器中明确编写“广播”业务逻辑——它绝对不是隐含在 sendall
中(您可能误解了其语义)。
关于python - Socket.sendall() 不发送给所有连接的客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27594464/