Как отправить ответы нескольким клиентам после выполнения условия? - PullRequest
0 голосов
/ 03 февраля 2020

Я застрял на рабочем проекте. Проблема состоит в том, чтобы принимать соединения от различных клиентов, сохранять их на сервере в какой-то очереди или списке, а затем, после выполнения какого-либо условия, отправлять ответ клиентам в очереди в порядке FIFO.

#!/usr/bin/python3
import socket
import time

all_connections = []
all_address = []
all_msg= []

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind((socket.gethostname(), 4424))
server_socket.listen(20)

wait_list, interface_list, device_list = ([] for i in range(3))

print ("getting order from client...")              #Wait for next request from client

while True:
    clientsocket, address = server_socket.accept()
    all_connections.append(clientsocket)
    all_address.append(address)
    print(f"Connection from {address} has been established.")
    message_from_client = all_connections[0].recv(1024)
    print(message_from_client)###
    decode_msg= message_from_client.decode("utf-8")
    all_msg.append(decode_msg)

    if "success" in all_msg[0] and len(wait_list) != 0:
        print("Received request: %s" % decode_msg)
        new_decode_msg=all_msg[0].replace("success", "")
        if new_decode_msg not in wait_list:
            print("stored in wait list")
            wait_list.append(new_decode_msg)
            socket.send(b'stored')
        else:
            print("already stored")
            socket.send(b'already stored')
        wait_parts= wait_list[0].split(" ")
        if wait_parts[0] not in interface_list:
            print("Server is ready")
            response= wait_list[0] + " connect"
            all_connections[0].sendto(response.encode('utf-8'), all_address[0])             #Send reply back to client
            interface_list.append(wait_parts[0])
            device_list.append(wait_parts[0] + wait_parts[1])
            try:
                wait_list.pop(0)
                all_msg.pop(0)
                all_address.pop(0)
                all_connections.pop(0)
                print(all_msg)
                print(all_address)
            except:
                pass
            finally:
                time.sleep(2)
        else:
            print("waiting for disconnection")
            all_connections[0].send(b'not disconnected')
            time.sleep(2)

    elif "failure" in decode_msg:
        new_decode_msg=decode_msg.replace("failure", "")
        parts=new_decode_msg.split(" ")
        if parts[0] in interface_list and (parts[0] + parts[1]) in device_list:
            print("Received request: %s" % decode_msg)
            print("disconnected successfully")
            all_connections[0].send(b'disconnect')      #Send reply back to client
            interface_list.remove(parts[0])
            device_list.remove(parts[0] + parts[1])
            time.sleep(2)
        else:
            all_connections[0].send(b'not disconnected')
            time.sleep(2)
    else:
        wait_list.append(decode_msg.replace("success", ""))
        all_connections[0].send(b'not yet connected')

Таким образом, файл клиента также бесконечен, в то время как l oop. файл клиента:

while True:
        if args.connect:
            server_socket.send(bytes(" success ".join([args.interface, args.device]), 'utf-8'))
            recived_response=server_socket.recv(1048)
            d_rec= recived_response.decode("utf-8")
            msg_array=d_rec.split(" ")
            if 'connect' in msg_array:
                connect(relayboards.get(devices[args.device][args.interface].get("board")) ,int(PORT))
                digital_command(args.device, args.interface, "connect")
                print("ready to connect...%s" % d_rec)
                print("~~CONNECTED~~")
                #server_socket.close()
                break
            else:
                continue
                #print("oops")

        elif args.disconnect:
            connect(relayboards.get(devices[args.device][args.interface].get("board")) ,int(PORT))
            server_socket.send(bytes(" failure ".join([args.interface, args.device]), 'utf-8'))
            if  server_socket.recv(30)== b'disconnect':
                digital_command(args.device, args.interface, "disconnect")
                print("~~DISCONNECTED~~")
                #server_socket.close()
                break
            else:
                print("the device was not connected at the first place")
                #server_socket.close()
                break

Есть идеи по этому поводу? Спасибо

...