跳转至

UDP发送数据

学习目标

  • 知道使用 socket 的 sendto 方法能够发送数据

1. UDP简介

UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接。简单来说,当一台计算机向另外一台计算机发送数据时,发送端不会确认接收端是否存在,就会发出数据,同样接收端在收到数据时,也不会向发送端反馈是否收到数据。

由于使用UDP协议消耗资源小,通信效率高,所以通常都会用于音频、视频和普通数据的传输例如视频会议都使用UDP协议,因为这种情况即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。

但是在使用UDP协议传送数据时,由于UDP的面向无连接性,不能保证数据的完整性,因此在传输重要数据时不建议使用UDP协议。

UDP传输数据被限制在64K以内。

2. UDP的特点

  • 需要资源少
  • 不保证接收
  • 无连接

3. UDP和TCP的区别

UDP TCP
面向无连接 面向有连接
支持一对一、一对多、多对一、和多对多的通信 只能有两个端点,实现一对一的通信
不保证数据传输的可靠性 传输数据无差错,不丢失,不重复,且按时序到达
占用资源较少 占用资源较多

4. UDP接收和发送流程

4. 实现步骤及核心方法介绍

4.1 实现步骤:

  1. 导入模块socket
  2. 创建socket套接字
  3. 发送数据
  4. 关闭套接字

4.2 核心方法:

  • UDP 发送数据使用的 3 个方法方法:
  • socket.socket —— 建立套接字
"""
socket 参数说明
1. socket.AF_INET       表示 IPv4 地址
2. socket.SOCK_DGRAM    表示使用 UDP 协议传输数据
"""
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  • socket.sendto —— 发送数据
"""
sendto 参数说明
1. 要发送的二进制数据
2. 元组类型,指定把 (参数 1 的数据) 发送给谁
   (ip 地址字符串,端口数值)
"""
udp_socket.sendto("你好".encode(), ("127.0.0.1", 8888))
  • socket.close —— 关闭套接字
# 4. 关闭套接字(close)
udp_socket.close()

5. 参考代码

#coding=utf-8
# 导入socket模块
import socket

# 判断模块是否是程序的入口,判断整个模块是否是主模块
if __name__ == '__main__':

    # 创建socket
    # AF_INET 表示ip地址,也是internet互联网
    # SOCK_DGRAM 表示使用udp 协议
    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

    # 设置内容
    send_content = "哈哈,我来自火星!~"

    # 把文本内容转码,转成二进制数据
    send_data = send_content.encode("utf-8")

    # 发送数据
    # ("192.168.31.221", 8080) 接收数据方ip地址和端口
    udp_socket.sendto(send_data, ("192.168.31.221", 8080))

    # 关闭数据
    udp_socket.close()