前言
在了解UDP之前 ,我们先了解一下网络编程 ,包括三个要素,分别是IP地址、端口号和通信协议,那本文主要讲述的是UDP这种通信协议,以及编程的实现。
一、IP地址
网络中的计算机使用IP地址来进行唯一标识,IP地址有IPv4和IPv6两种类型。IPv4采用十进制或二进制表示形式,十进制是一种比较常用的表示形式,如192.168.1.131,IPv6采用十六进制表示形式,一般不常用。
在Windows系统下,打开cmd,输入命令ipconfig,按回车即可查看。在Linux或Mac系统下,打开终端,使用ifconfig命令,按回车即可查看。
二、端口号
端口号是计算机中的应用程序的一个整数数字标号,用来区分不同的应用程序。
0 ~ 1024 为被系统使用或保留的端口号,0 ~ 65535为有效的端口号,也就是说我们要对一些程序定义端口号的时候,要选择1024 ~ 65535范围内的整数数字。
网络协议—UDP概述
UDP(User Datagram Protocol)用户数据报协议
UDP的包头格式很简单,只有源端口号和目标端口号:
UDP的特点
- 无连接:直到对端的IP和端口号就直接进行传输,不需要建立连接
- 不可靠:没有确认机制,没有重传机制;因为没有网络故障该段无法发送到对方,UDP协议层也不会给应用层返回任何错误信息
- 面向数据报:不能够灵活的控制读写数据的次数和数量, 控制选项较少,数据传输过程中延迟小,数据传输效率高
编程实践
客服端与服务端
基于UDP的socket编程
接收端
1、创建套接字
2、将套接字绑定到一个本地地址和端口上(blind)
3、等待接受数据(recvform)
4、关闭套接字。
客户端
1、创建套接字
2、向服务器发送数据(sendo)
3、关闭套接字
Code
from socket import *
# 1. 创建udp套接字
udp_socket = socket(AF_INET, SOCK_DGRAM)
# 2. 准备接收方的地址
# '192.168.123.7'表示目的ip地址
# 8080表示目的端口
dest_addr = ('192.168.123.7', 8080) # 注意 是元组,ip是字符串,端口是数字
# 3. 从键盘获取数据
send_data = input("请输入要发送的数据:")
# 4. 发送数据到指定的电脑上的指定程序中
#udp_socket.sendto(b"hahahah", dest_addr)
udp_socket.sendto(send_data.encode('utf-8'), dest_addr)
# 5. 关闭套接字
udp_socket.close()
from socket import *
# 1. 创建套接字
udp_socket = socket(AF_INET, SOCK_DGRAM)
# 2. 绑定本地的相关信息,如果一个网络程序不绑定,则系统会随机分配
local_addr = ('192.168.123.7', 8080) # ip地址和端口号,ip一般不用写,表示本机的任何>一个ip
udp_socket.bind(local_addr)
# 3. 等待接收对方发送的数据
recv_data = udp_socket.recvfrom(1024) # 1024表示本次接收的最大字节数
# 4. 显示接收到的数据
print(recv_data[0].decode('gbk'))
# 5. 关闭套接字
udp_socket.close()