Я хотел сделать очень быстрое приложение для Android, чтобы общаться с моим домашним сервером, работающим на Ubuntu.
Итак, я сделал что-то в python с информацией о моих предыдущих ответах на этот вопрос
Link -> Самая быстрая связь с сервером?
Таким образом, идея состоит в том, чтобы использовать сокет UDP для широковещательной передачи каждую секунду сообщения 0b0000000. Когда клиент получает эти данные 0b00000000, он отправляет подтверждение обратно как 0b00000001.Поэтому я немного изменился.
Когда сервер получает это сообщение.Обмен данными может начаться.Проблема в том, что я использую цикл while (True), который я знаю очень плохо, когда подтверждение получено.
Но когда клиент закрывает соединение, сервер все еще пытается отправить данные и не возвращаетсяна вещание.
Итак, мой вопрос, могу ли я сделать так, чтобы код сервера вернулся к вещанию.
Код моего сервера:
import socket
import time
import signal
server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM,
socket.IPPROTO_UDP)
server.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
server.setblocking(0)
# Set a timeout so the socket does not block
# indefinitely when trying to receive data.
server.settimeout(0.3)
server.bind(("", 44446))
#message = b"your very important message"
def stopServer(signum, frame):
print 'Stopping server'
server.close()
signal.signal(signal.SIGINT, stopServer)
while True:
packageHeader = bin(0b00000000)
server.sendto(packageHeader, ('<broadcast>', 37020))
print("broadcasting!")
time.sleep(1)
try:
data, addr = server.recvfrom(1024)
#print("received message: %s"%data)
if(data == bin(0b00000001)):
#got a acknowledgement
print("received acknowledgement")
while(True):
server.sendto(packageHeader, ('<broadcast>', 37020))
time.sleep(0.01)
except (KeyboardInterrupt, SystemExit):
server.close()
raise
except:
pass
Мой код клиента:
import socket
import signal
import time
client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # UDP
client.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
client.bind(("", 37020))
def stopClient(signum, frame):
print 'Stopping server'
client.close()
signal.signal(signal.SIGINT, stopClient)
while True:
data, addr = client.recvfrom(1024)
print("received data: %s"%data)
#print(data)
if(data == bin(0b00000000)):
#Got message from server
#change data bit placement number 0 to a value of 1
acknowledge = bin(0b00000001)
#try to send a acknowledge back
try:
client.sendto(acknowledge, ('<broadcast>', 44446))
while(True):
data, addr = client.recvfrom(1024)
print("receiving data")
else:
break
except (KeyboardInterrupt, SystemExit):
client.close()
raise
except:
pass
ОБНОВЛЕНИЕ:
Это что-то? Python: определить, когда сокет отключается по какой-либо причине?
Используется select