Хорошая вещь в программировании сокетов состоит в том, что вы можете делать все, что хотите, и есть много вещей, чтобы найти решение для данной проблемы. Это также очень плохая вещь в программировании сокетов ...
В любом случае, учитывая ваше описание, я думаю, используя неблокирующие сокеты и выбор циклов ( wikipedia , python docs ) вполне подойдет.
Вот фрагмент кода того, как это работает с использованием сокета UDP для связи с вашим сервером, будет похоже на TCP.
<!-- language: «Python» -->
import socket
import select
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
udp_socket.setblocking(0)
# Optional bind the socket to a local port
udp_socket.bind(('', 6666))
# send your request
....
# wait for an answer AT MOST X seconds
readable, _, _ = select.select([udp_socket], [], [], 5) # X is 5 in this case as you requested
# At this point either 5 seconds would have passed or your socket would have some information (response) in it earlier than the 5 seconds
if readable: # check if socket received a response
response = readable[0].recv(1024)
Вы можете проверить, работает ли он, подделав ответ сервера, отправив что-то в свой сокет, пока select
ожидает. Вы можете сделать это, отправив с помощью / dev / udp. Для этого используйте:
echo "data" > /dev/udp/127.0.0.1/6666
Где 6666 в данном случае - это порт, к которому привязан сокет.