前面介绍了创建TCP连接,请见木头人:Python 标准库 socket 套接字网络通讯简介与创建TCP连接zhuanlan.zhihu.com
一、UDP与TCP通讯区别
UDP 无连接,通讯不需要建立连接;它支持一对一,一对多,多对一和多对多的交互通信;TCP尽量保持数据交互,但不能保证交互可靠;UDP 实时信好,效率高,适用于对高速传输和实时性有较高的通信或广播通信。
TCP 面向连接,点到点通讯,通讯前需要建立连接,也就是常说的3次握手;TCP传送的数据,无差错,不丢失,不重复,且按序到达,效率没有UDP高,但它可靠;
UDP 占用系统资源少,TCP占用系统资源比较多。
由于网络的数据与稳定性的提升,网络的丢包率很低,在加上应用层重传保证传输的可靠性,在越来越多的场景下优先考虑UDP。
二、创建UDP服务器通讯端
UDP 不用建立连接,所以不像TCP一样需要很多设置工作,服务器端直接等待进来的连接就好了。
UDP服务端创建链接流程:
创建服务器套接字(ss = socket())
↓
绑定服务器套接字(ss.bind())
↓
服务器无限循环(inf_loop:)
↓
对话(接收与发送)(cs = ss.recvfrom()/ss.sendto())
↓
关闭服务器套接字(ss.close())(可选)
示例:创建一个能接收客户的消息,在消息前加一个时间戳后返回的UDP服务器。
udp_socket_server.py
from socket import *
from time import ctime
HOST = ''
PORT = 8080
BUFSIZ = 1024
ADDR = (HOST, PORT)
udpSerrverSocket=socket(AF_INET,SOCK_DGRAM) # 创建UDP连接
udpSerrverSocket.bind(ADDR) # 绑定服务器地址
while True: # 服务器无线循环
print('等待连接...')
data,addr=udpSerrverSocket.recvfrom(BUFSIZ) # 接受客户的连接
udpSerrverSocket.sendto(bytes('[%s]%s' % (ctime(), data),encoding='utf-8'), addr) # 发送UDP 数据
print( '连接地址:', addr)
udpSerrverSocket.close() # 关闭服务器连接
三、创建UDP客户机通讯端
客服端创建链接流程:
创建客户套接字(ss = socket())
↓
通讯循环(comm_loop:)
↓
对话(接收与发送)(cs.sendto()/cs.recvfrom())
↓
关闭客户套接字(cs.close())
示例:与前面udp_socket_server.py 进行通讯
udp_socket_client.py
from socket import *
HOST = '127.0.0.1' # 服务器连接地址
PORT = 8080 # 服务器启用端口
BUFSIZ = 1024 # 缓冲区大小
ADDR = (HOST, PORT)
udpCliendSocket = socket(AF_INET, SOCK_DGRAM)
while True:
data = bytes(input('> '), encoding="UTF-8")
if not data:
break
udpCliendSocket.sendto(data, ADDR)
data, ADDR = udpCliendSocket.recvfrom(BUFSIZ)
if not data:
break
print (data)
udpCliendSocket.close()
五、运行客户端与服务器程序先运行服务器端程序 (win系统 cmd 窗口命令 python socket_server.py )。
再运行客户端程序 (win系统 重新开 cmd 窗口 命令 python socket_client.py )。
在客户端程序输入内容 Hi woodman 。
服务端输出内容:等待连接...
连接地址: ('127.0.0.1', 51105)
等待连接...
客户端输出内容:b"[Mon Nov 12 09:52:19 2018] b'Hi woodman'"
服务器与客户端通讯流程服务器启动端口监听,监听端口数据报文。
当客户端发送报文数据,(报文包含客户端ip端口,服务器ip端口,需发送的数据)
在客户端接受服务的时候,服务器又回去等待其它客户端的数据报文。
服务器对接收数据并进行处理,将返回数据封装发送到客户端。