Реализация python сокета UDP.Как вернуться к вещанию? - PullRequest
0 голосов
/ 26 сентября 2018

Я хотел сделать очень быстрое приложение для 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...