繁体   English   中英

python UDP socket客户端需要发送两次才能让服务器接收到包

[英]python UDP socket client need to send twice so that the server can receive the package

我有一个客户端会向我的服务器发送一些字符串。 但是,我需要发送两次,以便服务器获取包裹。 所以对于每一个客户端想要发送服务器的包,它需要发送两次。 我不明白为什么会这样。

我的服务器的监听代码:

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()
    received = sock.recvfrom(bufferSize)[0]
    address = sock.recvfrom(bufferSize)[1]

第一个recvfrom将进行第一次读取。 第二个recvfrom将再次读取。 瞧:你需要读两遍。 相反,您应该进行一次阅读:

    received, address = socket.recvfrom(bufferSize)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM