python UDP-сокет клиент должен отправить дважды, чтобы сервер мог получить пакет - PullRequest
0 голосов
/ 25 января 2020

У меня есть клиент отправит некоторую строку на мой сервер. Тем не менее, мне нужно отправить дважды, чтобы сервер получил пакет. Таким образом, для каждого пакета клиент хочет отправить сервер, он должен отправить дважды. Я не понимаю, почему это так.

код моего сервера, который прослушивает:

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
myIp = "0x2A"
myPort = 2222
targetPort = 0
myAddress = ("localhost",myPort)
bufferSize = 1024

def listen():

    print('starting up on {} port {}'.format(*myAddress))
    sock.bind(myAddress)
    # sock.listen(1)
    print("waiting for message")
    # connection, client_address = sock.accept()
    while True:

        received = sock.recvfrom(bufferSize)[0]
        address = sock.recvfrom(bufferSize)[1]
        received = json.loads(received.decode()) 
        source = received.get("source")
        destination = received.get("destination")
        length = received.get("length")
        message = received.get("message")
        protocol = received.get("protocol")

        print("the source is: " + source)
        if destination == myIp:
            print("the message is: " + message)
            print('sending back to sender...')
            sock.sendto(message.encode(),address)

            if protocol == 0:
                print("protocol is: " + str(protocol))
            elif protocol == 1:
                print("protocol is: " + str(protocol))
                print("write data to log file....")
                f = open("log.txt","w")
                f.write(message)
                print('done!')

            elif protocol == 2:
                print("protocol is: " + str(protocol))
                # sock.close()
                print("exit")
                sock.close()
                sys.exit()
        else:
            print("this is not my package: \n" + "destination Ip is: " + destination + "\n my Ip is: " + myIp)

        if not received:
            break

код моего клиента, который отправляет:

def send():
    try:
        sock.sendto(message.encode(),serverAddress)
        print("message: " + message +  " is sent")
    finally:
        print('closing socket')
        sock.close()

1 Ответ

1 голос
/ 25 января 2020
    received = sock.recvfrom(bufferSize)[0]
    address = sock.recvfrom(bufferSize)[1]

Первый recvfrom выполнит первое чтение. Второй recvfrom сделает еще одно чтение. Вуаля: вам нужно два чтения. Вместо этого вы должны сделать одно чтение:

    received, address = socket.recvfrom(bufferSize)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...