【发布时间】:2015-09-14 04:27:54
【问题描述】:
我有一个设置了套接字和线程的服务器,当我将多个客户端连接到它时,如果一个客户端发送一条消息,服务器会将相同的消息重复给它,而不是所有其他连接的客户端。例如:
#server terminal
Server is connected on 8000
('127.0.0.1', 50328) is Connected
('127.0.0.1', 50329) is Connected
Received Message b'hi\n'
#Client 1 terminal
#input
[user1]hi
#returns:
[user1] b'hi\nhi\n'[user1]
#Client 2 terminal
#doesn't return anything, just sits at the prompt
[user2]
服务器的相关代码是:
def clientHandler():
c, addr = s.accept()
print(addr, "is Connected")
if addr not in clients:
clients.append(addr)
try:
while True:
data = c.recv(1024)
if not data:
break
print("Received Message ", repr(data))
for client in clients:
c.sendto(data, client)
except:
print("Error. Data not sent.")
我已阅读以下资料,但无济于事:
python tcp server sending data to multiple clients
https://docs.python.org/3/library/socket.html
我必须怎么做才能让它通过服务器将 user1 的消息发送给所有其他用户?
编辑 1: 所有server.py代码:
from socket import *
from threading import Thread
clients = []
def clientHandler():
c, addr = s.accept()
print(addr, "is Connected")
if addr not in clients:
clients.append(addr)
try:
while True:
data = c.recv(1024)
if not data:
break
for client in clients:
c.sendto(data, client)
except:
print("Error. Data not sent to all clients.")
HOST = '' #localhost
PORT = 8000
s = socket(AF_INET, SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(5)
print("Server is running on "+ str(PORT))
#Thread(target=clientHandler).start()
#Thread(target=clientHandler).start()
#Thread(target=clientHandler).start()
for i in range(5):
Thread(target=clientHandler).start()
s.close()
【问题讨论】:
-
您是否为每个新客户端使用多个线程?如果是这样,请同时向我们展示相关代码
-
如果它真的将数据发送给所有客户端,你会不会陷入无限发送循环?接收数据 --> 发送给所有主机 --> 他们都接收数据 --> 再次发送给所有主机,以此类推?
-
我不确定。我从服务器向所有客户端发送数据的方式是使用 for 循环。我认为,一旦它遍历客户列表中的所有可能性,它就会停止。没有?
-
它是一个客户端/服务器模型,我不认为客户端会发回他们收到的所有内容。服务器是将数据发送到多个客户端的那个,而不是相反,我猜
-
是的,这是正确的。例如,我的服务器是从客户端 1 接收数据的服务器,然后必须将该数据发送到客户端列表中的每个其他客户端
标签: python multithreading sockets python-3.x