Я застрял на рабочем проекте. Проблема состоит в том, чтобы принимать соединения от различных клиентов, сохранять их на сервере в какой-то очереди или списке, а затем, после выполнения какого-либо условия, отправлять ответ клиентам в очереди в порядке 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
Есть идеи по этому поводу? Спасибо