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时会取走。

 

 

上一篇:python之sock套接字


下一篇:python3 FTP文件的上传下载