服务器套接字没有回答

时间:2018-06-02 17:31:51

标签: multithreading python-3.x sockets ipc

我正在尝试使用套接字使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)

0 个答案:

没有答案