1,udp知识
UDP,User Datagram Protocol
IP地址作用
端口作用
套接字地址 (IP,PORT)
创建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(本地套接字地址)
str - bytes
2,tcp知识
1、TCP特点
面向连接 - 通信之前必须先建立连接
可靠传输
应答机制
超时重传
有序编号
校验机制
流量控制
2、TCP客户端流程
connect函数 创建和服务器之间的连接
参数 服务器套接字(IP,port)
recv函数 接收TCP数据 - 阻塞等待
参数 表示本次接收的最大长度
返回值两种作用
正常情况 接收到的是对方发给自己的数据<bytes类型>
如果收到的数据是b'' 说明对方断开连接
send函数 发送TCP数据
参数 表示发送的数据<bytes类型>
返回值 成功发送的字节数 -----了解
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)