python中UDP和TCP

UDP:
创建UDP套接字
import socket
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

关闭UDP套接字
udp_socket.close()

使用UDP套接字发送数据
udp_socket.sendto(bytes类型数据, 收件人套接字地址)

使用UDP套接字接收数据 - 阻塞接收数据
bytes类型的数据, 发件人套接字地址 = udpp_socket.recvfrom(本次接收的最大长度)

使用固定端口-bind 

udp_socket.bind(本地套接字地址)

TCP:

        1、TCP特点
面向连接 - 通信之前必须先建立连接
可靠传输
应答机制
超时重传
有序编号
校验机制
流量控制
2、TCP客户端流程
connect函数 创建和服务器之间的连接 
参数 服务器套接字(IP,port)

recv函数   接收TCP数据 - 阻塞等待

参数 表示本次接收的最大长度
返回值两种作用
正常情况  接收到的是对方发给自己的数据
如果收到的数据是b''  说明对方断开连接

send函数  发送TCP数据
参数 表示发送的数据
返回值 成功发送的字节数 -----了解

3. 服务器流程

listen函数
变为被动套接字 - 接受到来自客户端的连接
accept函数
客户端关联的套接字, 客户端地址 = accept() 阻塞等待 - 从等待服务器取出一个客户服务 

4. 2MSL状态
TCP规定 主动断开连接的一方 需要等待30s-2min  以 确认最后一次ACK一定被对方接收到

---> 导致了 TCP连接使用的端口 在30s-2min 内 不能理解重新再次绑定

解决方案  set socket option 设置套接字选项
sock.setsockopt()

5. 出现address in use问题的三种原因

1. pycharm同时启动了多个程序绑定同一个端口
2. pycharm 后台进程还在继续占用 之前的端口
3. TCP 2MSL时间

---  设置套接字选项 并且 终端运行
# 忽略2MSL时间规定 可以让TCP服务器不用等待2MLS时间可以理解重新绑定 之前的端口
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

你可能感兴趣的:(python中UDP和TCP)