我正在尝试使用套接字使5个客户端线程与5个服务器端线程进行通信。每个客户端为每个服务器发送一个不同的随机数。但只有服务器0接收消息。 尽管如此,所有客户端都会结束执行(需要服务器确认)。 我一直在环顾四周,发现了一些关于失去联系的事情,但我不知道如何解决这个问题。
这是我的代码:
# imports
from threading import Thread
from random import randint
import socket
import time
# variável de condição de parada do servidor
num_threads = 5
threads_atendidas = [0, 0, 0, 0, 0]
# controle de tempos
tempos = []
# controle de conexão
# conexao[i] = id, conectado, enviado
conexao = [
[0, False, False],
[0, False, False],
[0, False, False],
[0, False, False],
[0, False, False]]
conectados = [conexao, conexao, conexao, conexao, conexao]
em_espera = [False, False, False, False, False]
# linha de execução da thread servidor
def server(id):
global conectados
global threads_atendidas
global em_espera
cliente_id = -1
port = 5000 + id
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('localhost', port))
server.listen(25)
print("Servidor {} iniciado".format(port))
while(threads_atendidas[id] < num_threads):
print("\nServidor {} esperando conexão\n".format(port))
em_espera[id] = True
connect, client = server.accept()
em_espera[id] = False
print('Cliente', client, 'conectado pela porta', port)
flag = False
while(not flag):
for i in range(len(conectados[id])):
if(conectados[id][i][0] == client[1]):
conectados[id][i][1] = True
cliente_id = i
flag = True
print('Cliente {} aceito ({})'.format(cliente_id, port))
print("\nServidor {} recebeu conexão\n".format(port))
while(True):
msg = connect.recv(50)
if(not msg):
break
print("\nServidor {} recebeu a mensagem\n".format(port))
conectados[id][cliente_id][2] = True
print('O cliente', client, 'enviou a mensagem:', msg.decode())
print('O cliente', client, 'finalizou sua conexão.')
threads_atendidas[id] += 1
connect.close()
print("Servidor {} concluído".format(port))
# linha de execução da thread cliente
def client(id):
global conectados
for i in range(5):
while(not em_espera[i]):
pass
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
port = 5000 + i
dest = ('localhost', port)
msg = str(randint(0, 100))
while(not conectados[i][id % 5][1]):
try:
client.connect(dest)
conectados[i][id % 5][0] = client.getsockname()[1]
print('- Thread {} conectada na porta {}.'.format(id, port))
print('- ID de cliente:', conectados[i][id % 5][0])
client.send(msg.encode())
except Exception:
time.sleep(0.001)
finally:
client.close()
while(not conectados[i][id % 5][2]):
pass
print('Thread {} enviou {} na porta {}'.format(id, msg, port))
print("Cliente {} concluído".format(id))
# criação e inicialização da thread servidor
for i in range(num_threads):
tserver = Thread(target=server, args=(i, ))
tserver.start()
# criação e inicialização das threads cliente
for i in range(num_threads, 10):
tclient = Thread(target=client, args=(i, ))
tclient.start()
tclient.join()
# time.sleep(1)