645 views
Python高级技巧

5.socket编程-UDP

文章目录

socket编程-UDP

UDP 特性
- UDP 对数据的安全性,是否完整顺序到底对方,对方是否接手没有严格要求,继承IP特性
- UDP 是面向无连接的,就像我们寄快递一样,我们只要把我们的送达地址写好,至于采用什么快递都无所谓
- UDP 是一个一个的发,一个一个的收,数据格式基于数据报(包含报头以及数据本身)
- UDP 是应用需要发,就会发送,不处理堵塞(不要把处理UDP程序写在主线程里面)

应用场景
- 广播和多播应用必须使用UDP,也就是 一对多的情况
- 简单的请求-应答应用程序可以使用UDP,对数据流,丢不丢包都没关系,就可以使用UDP
- 对于海量数据传输不应该使用UDP,对数据传输比较严格
- DNS、NFS、流媒体传输等等

UDP通信

UDP发送数据

1 创建套接字
2 绑定本地信息(IP和端口)
3 接受数据
4 打印数据
5 关闭套接字
6.如果程序运行时,没有绑定端口,那么操作系统会自动分配一个端口给程序。 而且同一端口,不能用两次。


import socket
# def main():
#     # 创建一个udp套接字
#     udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
#
#     # 发送数据
#     send_data = '666'
#     # encode
#     # Windows gbk
#     udp_socket.sendto(send_data.encode('gbk'), ('192.168.0.161', 7890))
#
#     udp_socket.close()

def main():
    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    # 没有绑定的话 端口就是随机分配的
    udp_socket.bind(("", 7890))
    while True:
        send_data = input('请输入要发送的数据:')
        if send_data == 'exit':
            break
        send_data = send_data.encode('gbk')
        udp_socket.sendto(send_data, ('192.168.0.161', 8080))
    udp_socket.close()

if __name__ == '__main__':
    main()

UDP接受数据

'''
UDP接收数据
1 创建套接字
2 绑定本地信息(IP和端口)
3 接受数据
4 打印数据
5 关闭套接字
'''
import socket
def main():
    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

    # 不写ip 表示本机的任何一个ip
    bind_addr = ('', 7789)
    udp_socket.bind(bind_addr)

    while True:
        # 1024 表示本次接收的最大字节数
        recv_data = udp_socket.recvfrom(1024)
        # 元组 接收到的数据  (发送方的ip,端口)

        # (b'1', ('192.168.0.161', 8080))
        # print(recv_data)
        recv = recv_data[0]
        send_data = recv_data[1]
        print("%s:%s" % (str(send_data), recv.decode('gbk')))
    udp_socket.close()

if __name__ == '__main__':
    main()

UDP实现简单聊天器

'''
聊天器
'''
import socket

def send_data(udp_socket):
    """发送数据"""
    send_data = input('请输入要发送的数据:')
    dest_ip = input('请输入要发送的IP:')
    dest_port = int(input('请输入要发送的端口:'))
    udp_socket.sendto(send_data.encode('gbk'), (dest_ip, dest_port))

def recv_data(udp_socket):
    """接收数据"""
    recv_data = udp_socket.recvfrom(1024)
    print("%s:%s" % (recv_data[1], recv_data[0].decode('gbk')))


def main():
    # 创建套接字  同时接收发送数据
    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

    # 绑定
    udp_socket.bind(("", 7788))

    while True:
        # 发送
        send_data(udp_socket)
        # 接收
        recv_data(udp_socket)
    # udp_socket.close()

if __name__ == '__main__':
    main()

影子专属博客 赣ICP备17013143号