# 这是学习廖雪峰老师 python 教程的学习笔记
1, 概览
TCP 是建立可靠连接, 并且通信双方都可以以流的形式发送数据. 相对 TCP,UDP 则是面向无连接的协议.
使用 UDP 协议时, 不需要建立连接, 只需要知道对方的 IP 地址和端口号, 就可以直接发数据包. 但是, 能不能到达就不知道了.
虽然用 UDP 传输数据不可靠, 但它的优点是和 TCP 比, 速度快, 对于不要求可靠到达的数据, 就可以使用 UDP 协议.
和 TCP 类似, 使用 UDP 的通信双方也分为客户端和服务器.
1.1,server 端
- import threading,time,socket
- def tcplink(sock, addr,data):
- sock.sendto(('Hello, %s!' % data.decode('utf-8')).encode('utf-8'),addr) # 收到的数据加 Hello, 发回去
- print('Connection from %s:%s closed.' % addr) # 提示消息
- s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 创建 socket 对象
- s.bind(('127.0.0.1', 9999)) # 绑定端口
- print('Bind UDP on 9999...')
- while True:
- # 服务端用 recvfrom() 方法返回数据和客户端的地址与端口
- # 这样, 服务器收到数据后, 直接调用 sendto() 就可以把数据用 UDP 发给客户端
- data, addr = s.recvfrom(1024)
- print('Received from %s:%s.' % addr)
- t=threading.Thread(target=tcplink,args=(s,addr,data))
- t.start()
1.2,client 端
- import socket
- s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
- for data in [b'Michael', b'Tracy', b'Sarah']:
- # 发送数据
- s.sendto(data, ('127.0.0.1', 9999))
- # 接收数据, 客户端接收数据还是用 recv() 方法
- print(s.recv(1024).decode('utf-8'))
- s.close()
结果:
可以看到, UDP 是发一次数据建立一次连接
1.3, 小结
UDP 的使用与 TCP 类似, 但是不需要建立连接. 此外, 服务器绑定 UDP 端口和 TCP 端口互不冲突, 也就是说, UDP 的 9999 端口与 TCP 的 9999 端口可以各自绑定.
来源: http://www.bubuko.com/infodetail-2604472.html