简介
在网络通信编程中,用的最多的就是UDP和TCP通信了,原理这里就不分析了,网上介绍也很多,这里简单列举一下各自的优缺点和使用场景
通信方式 | 优点 | 缺点 | 适用场景 |
---|---|---|---|
UDP | 及时性好,快速 | 视网络情况,存在丢包 | 与嵌入式设备通信,实时控制 场景 |
TCP | 丢包会自动重发,理论上不用担心丢包问题 | 延时相对大一些 | 通信可靠性场景,比如IoT设备 控制,状态同步 |
一、socket
我们要进行网络通信,那么就要用到socket,socket即网络套接字,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。
在 Python 中,使用socket 模块的函数 socket 就可以创建一个socket对象,socket()函数的参数分别有family, type, proto。
1.其中family参数是指协议域,又称为协议族(family),常用的协议族有,AF_INET、AF_INET6、...等等,AF_INET指ipv4,AF_INET6即为ipv6;
2.然后是type,type指定socket类型,有SOCK_STREAM(流式套接字,主要用于 TCP 协议)和SOCK_DGRAM(数据报套接字,主要用于 UDP 协议)等等;
3.proto就是指定的协议,常用的协议有,IPPROTO_TCP、IPPTOTO_UDP、IPPROTO_SCTP、IPPROTO_TIPC等,它们分别对应TCP传输协议、UDP传输协议、STCP传输协议、TIPC传输协议,但是type和proto不可以随意组合,当proto参数为0或者不填时,会自动选择type类型对应的默认协议。
二、UDP发送数据
首先我们要导入socket包
import socket
创建一个udp套接字,ipv4协议,使用SOCK_DGRAM参数,不填proto,就会默认自动选择udp协议;
# 1、创建一个UDP套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
然后我们把要接收数据的那一端的ip地址和端口号放在一个元组里准备好
# 2. 准备接收方的地址和端口,'127.0.0.1:9999'表示目的ip地址,9999表示目的端口号
udp_addr = ('127.0.0.1', 9999) # 注意这是一个元组,其中ip地址是字符串,端口号是数字
准备好后就可以使用sendto函数进行发送了,要注意,需要对字符串进行编码才可以发送
# 3. 发送数据到指定的ip和端口
udp_socket.sendto("Hello,I am a UDP socket.".encode('utf-8'), dest_addr)
发送完就可以关闭套接字了
# 4. 关闭套接字
udp_socket.close()
例程一:UDP server端,UDP数据接收
#!/usr/bin/python3
# -*- coding: utf-8 -*-
"""
udp通信例程:udp server端,修改udp_addr元组里面的ip地址,即可实现与目标机器的通信,
此处以单机通信示例,ip为127.0.0.1,实际多机通信,此处应设置为目标客户端ip地址
"""
from time import sleep
import socket
def main():
# u