我已经编写了一个用于接收多个客户端的服务器,它可以分别与客户端通信。在这里,我可以列出服务器中已连接的客户端,但是当客户端断开连接时,它不会从服务器中删除客户端。
Server.py
import socket
from threading import Thread
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
ip = '0.0.0.0'
port = 4141
s.bind((ip, port))
s.listen(5)
connected_clients=[]
def handle_client(c, addr):
while True:
try:
message = input("You: ")
message = message.encode("ascii")
c.send(message)
except:
print("Disconnected for sending..")
reply = c.recv(4141)
if not reply:
print("Disconnected for receiving..")
else:
reply = reply.decode('ascii')
print("Other : ", reply)
while True:
c, addr = s.accept()
# print('Connected:', addr)
connected_clients.append(addr[0])
print(connected_clients)
t = Thread(target=handle_client, args=(c, addr))
t.setDaemon(True)
t.start()
Client.py
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
port = 4141
ip = input('Enter the IP Address::')
s.connect((ip, port))
while True:
message = input("You: ")
message = message.encode("ascii")
s.send(message)
reply = s.recv(4141)
reply = reply.decode('ascii')
print("Other : ", reply)
s.close()
1)列出服务器中已连接的客户端以及其他客户端(每个客户端都需要列出服务器中当前处于活动状态的所有客户端)
2)当服务器断开与服务器的连接时,还必须删除客户端,此更新的连接的客户端信息必须传递到所有当前连接的客户端中。
我已经通过以下答案进行了研究,但没有成功。
答案 0 :(得分:0)
我不太喜欢服务器开发,但这可能会有所帮助:
for client in connected_clients:
connected=str(connected_clients)
s.send(connected.encode())
这可以根据要求完成,例如:
data = s.recv(1024)
if data == <command name here as string>:
#Call the code above.
要删除不活动的用户,您可以执行以下操作:
whoLeft = s.recv(1024)
if whoLeft in connected_clients:
connected_clients.remove(whoLeft)
您将不得不调整客户端,以便在断开连接之前发送其地址,否则应该没问题。
答案 1 :(得分:0)
希望这可以为您提供帮助:
const min = 1000;
const max = 10000;
const interval = 1000;
const ret = [...Array((max - min) / interval + 1)].map(
(_, i) => min + interval * i
);
console.log(ret);
此功能用于检查连接,客户端必须回答某些问题(对我来说是PING),如果他不回答,则表示已断开连接,因此我们将其从列表中删除。对我来说,这就是工作,您只需要经常使用此功能更新列表。