1.UDP简介
Internet协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP)。UDP为应用程序提供了无需建立就可以发送封装的IP数据包的方法。
Internet的传输层有两个协议,互为补充。无连接是UDP,它除了给应用程序发送数据包功能并允许他们所需的层次上架构自己的协议之外,几乎没有做什么特别的事情。面向连接的是TCP,该协议几乎做了所有的事情。
中文名:用户数据协议
外文名:User Datagram Protocol
特点:无连接、不可靠、快速传输
基础:IP数据包服务上增加一点功能
类别:传输层协议
用途:发送数据包
2.socket
一般socket我们称为套接字,并且在Python中有socket这个库(可以使用pip命令自行下载pip install socket
)。下面来说一下socket的简单流程:
1. 获取套接字
2. 绑定端口
3. 选择发送或者接受
4. 关闭套接字
2-1 socket的发送
socket的发送很简单,下面是一般的最简代码:
# -*- coding: utf-8 -*-
import socket
def sendMsg():
# 获取套接字
send_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 为套接字绑定端口与ip
# 这里的""是表示当前绑定的ip为本机的ip,后面的数字为该程序所绑定的端口号。
# 如果不提前绑定端口号,则可能发送的时候,有电脑自动为该程序分发一个端口号。
send_socket.bind(("", 7879)) # 当然这个端口也可以是7878,即发送的端口,后续会继续讲解
# 设置发送
send_socket.sendto(b"123", ("127.0.0.1", 7878))
# 关闭套接字
send_socket.close()
if __name__ == '__main__':
sendMsg()
2-2 socket的接收
注意,在recv中,一定需要提前绑定端口,因为这是接收消息的前提条件,那么选用什么端口呢?一般做实验或者写程序的时候,我们可以选择的端口范围在[1024-65535]之间。因为上面已经创建了socket的发送,并且选定了端口号为7878,那么我们此时的端口只需要绑定7878即可。
recv_socket.recvfrom(1024)表示单次接受的最大字节为1024,如果超出这个数值,那么只取前面的1024个。并且该函数返回的值是一个元组,与socket发送时一致(b"123", ("127.0.0.1", 7878))
,因此在想要获取接受的内容是,需要利用下标索引。这里还需要注意一点,因为我们在传输的时候是靠字节去传输的,因此获取到的也是字节,我们需要为它进行编码,但是win系统与linux系统是不相同的,win系统默认的是gbk编码,但是linux默认的是utf-8编码,因此在获取字节之后,需要根据系统的类型选择相应的解码格式。
# -*- coding: utf-8 -*-
import socket
def recvMsg(