标号(6):python(就业阶段)——网络UDP

<1>UDP含义:

英文全拼(User Datagram Protocol)简称用户数据报协议,它是无连接的、不可靠的网络传输协议

<2>UDP特点:

无连接、资源开销小(udp每个数据包最大是64K)、传输速度快、没有超时重发机制。

<3>UDP的优缺点:

(1)优点:传输速度快、不需要连接,资源开销小
(2)缺点:传输数据不可靠,容易丢数据包、没有流量控制。(当对方没有及时接收数据,发送方一直发送数据会导致缓冲区数据满了,电脑出现卡死情况,所有接收方需要及时接收数据。)

<4>socket介绍
1、socket的概念:

(套接字)不同进程之间进行通信的工具,将数据从一方传到另一方,完成数据传输

2、udp网络程序流程

(1)创建客户端套接字   import socket —> soc = socket.socket(AddressFamily, Type)

1、Address Family:IP地址类型; AF_INET表示ipv4类型、AF_INET6表示ipv6类型;
2、Type:套接字类型,可以是 SOCK_STREAM(TCP 协议)或者 SOCK_DGRAM(用UDP 协议)

(2)发送/接收数据

1、发送数据  soc.sendto(send_data,(ip,port))
2、收发数据  soc.recvfrom(1024)  ps:1024表示本次接收的最大字节数。
3、Windows使用的是gbk编码
4、Linux使用的是utf-8编码
  说明:一个udp网络程序,不绑定端口号,此时操作系统会随机分配一个端口号,如果绑定端口号,每次启动程序端口号不变。如果需要做成一个服务器端的程序的话,是需要绑定的

(3)关闭套接字  soc.close()

3、数据编码和解码

(1)str->bytes:encode编码  str.encode(encoding=“utf-8”, errors=“strict”)
(2)bytes->str:decode解码  bytes.decode(encoding=“utf-8”, errors=“strict”)
说明:
  1> strict:表示严格按照指定编解码方式进行编码和解码,如果编解码不成功则崩溃
  2> ignore:表示忽略编解码不成功的字符,如果编解码不成功程序不会崩溃

4、UDP发送广播消息

(1)广播地址最常用的是255.255.255.255
(2)设置socket的选项,允许发送广播消息:
  格式:udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, True)
说明:
  1> socket.SOL_SOCKET -> 表示当前套接字
  2> socket.SO_BROADCAST -> 表示套接字广播选项

*<5>udp网络程序-发送、接收数据——示例代码

import socket

# 1. 创建udp套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 2. 准备接收方的地址
dest_addr = ('192.168.236.129', 8080)

# 3. 从键盘获取数据
send_data = input("请输入要发送的数据:")

# 4. 发送数据到指定的电脑上
udp_socket.sendto(send_data.encode('utf-8'), dest_addr)

# 5. 等待接收对方发送的数据
recv_data = udp_socket.recvfrom(1024)  # 1024表示本次接收的最大字节数

# 6. 显示对方发送的数据
# 接收到的数据recv_data是一个元组
# 第1个元素是对方发送的数据
# 第2个元素是对方的ip和端口
print(recv_data[0].decode('gbk'))
print(recv_data[1])

# 7. 关闭套接字
udp_socket.close()

<6>发送广播消息——示例代码

import socket

if __name__ == '__main__':
    # 创建udpsocket
    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    # 设置socket的选项,允许发送广播消息
    udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, True)
    # 发送广播消息
    udp_socket.sendto("大家好,我叫小郭同学,多多关照!".encode("gbk"), ("255.255.255.255", 9090))
    # 关闭socket
    udp_socket.close()

<7>udp聊天器——示例代码

import socket


def send_msg(udp_socket):
    """获取键盘数据,并将其发送给对方"""
    # 1. 从键盘输入数据
    msg = input("\n请输入要发送的数据:")
    # 2. 输入对方的ip地址
    dest_ip = input("\n请输入对方的ip地址:")
    # 3. 输入对方的port
    dest_port = int(input("\n请输入对方的port:"))
    # 4. 发送数据
    udp_socket.sendto(msg.encode("utf-8"), (dest_ip, dest_port))


def recv_msg(udp_socket):
    """接收数据并显示"""
    # 1. 接收数据
    recv_msg = udp_socket.recvfrom(1024)
    # 2. 解码
    recv_ip = recv_msg[1]
    recv_msg = recv_msg[0].decode("utf-8")
    # 3. 显示接收到的数据
    print(">>>%s:%s" % (str(recv_ip), recv_msg))


def main():
    # 1. 创建套接字
    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    # 2. 绑定本地信息
    udp_socket.bind(("", 7890))
    while True:
        # 3. 选择功能
        print("="*30)
        print("1:发送消息")
        print("2:接收消息")
        print("="*30)
        op_num = input("请输入要操作的功能序号:")

        # 4. 根据选择调用相应的函数
        if op_num == "1":
            send_msg(udp_socket)
        elif op_num == "2":
            recv_msg(udp_socket)
        else:
            print("输入有误,请重新输入...")

if __name__ == "__main__":
    main()

猜你喜欢

转载自blog.csdn.net/weixin_42633359/article/details/82749570
今日推荐