Python-ネットワークプログラミング:udpチャット(半二重)


参照コード:
#      :
#    :     。
#    :        
#    :           ,        
#    :         ,        (    :      )
import socket

def send():
    # 1.    udp   
    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

    # 2.    
    local_addr = ("", 7898)
    udp_socket.bind(local_addr)

    #      ip   
    dest_ip = input("      ip:")
    try:
        dest_port = int(input("        :"))
    except:
        print("error input!")

    # 3.     
    while True:
        msg = input("(enter 'exit' to quit!)>")
        
        #        
        # udp_socket.sendto(msg.encode('utf-8'), ("127.0.0.1", 7788))
        udp_socket.sendto(msg.encode('utf-8'), (dest_ip, dest_port))
        if msg == 'exit':
            print('bye!')
            break
            
        #        
        # recvfrom       ,   
        recv_data = udp_socket.recvfrom(1024)
        recv_msg = recv_data[0].decode('utf-8')
        print("recive msg:%s"% recv_msg)
        if recv_msg == 'exit':
            break


    # 4.     
    udp_socket.close()

def recive():
    # 1.    udp   
    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

    # 2.    
    local_addr = ("", 7788)
    udp_socket.bind(local_addr)

    #      ip   
    dest_ip = input("      ip:")
    try:
        dest_port = int(input("        :"))
    except:
        print("error input!")

    # 3.     
    while True:
        #        
        # recvfrom       ,   
        recv_data = udp_socket.recvfrom(1024)
        # print(recv_data)
        recv_msg = recv_data[0].decode('utf-8')
        print("recive msg:%s"% recv_msg)
        if recv_msg == 'exit':
            break        

        msg = input("(enter 'exit' to quit!)>")
        
        #        
        # udp_socket.sendto(msg.encode('utf-8'), ("127.0.0.1", 7788))
        udp_socket.sendto(msg.encode('utf-8'), (dest_ip, dest_port))
        if msg == 'exit':
            print('bye!')
            break
            
        


    # 4.     
    udp_socket.close()


if __name__ == "__main__":
    func = ('exit', send, recive)
    choosenum = int(input("please enter which func to do(1:send, 2:recive):"))
    if choosenum<3 and choosenum>0:
        func[choosenum]()


注意:プログラムがreceiveを開始していない場合、すでにデータが来ており、オペレーティングシステムがデータ(ファイアウォールなどのセキュリティ保護ソフトウェアがこのポートを通過したデータを指す)を受信すると、オペレーティングシステムは先にデータを保存し、プログラムがreceiveを開くと取り出します.