TCP/UDP协议:
TCP(Transmission Control Protocol)一种面向连接的、可靠的、传输层通信协议(比如:打电话)
优点 : 可靠,稳定,传输完整稳定,不限制数据大小
缺点 : 慢,效率低,占用系统资源高,一发一收都需要对方确认
应用 :Web浏览器,电子邮件,文件传输,大量数据传输的场景
UDP(User Datagram Protocol)一种无连接的,不可靠的传输层通信协议(比如:发短信)
优点 : 速度快,可以多人同时聊天,耗费资源少,不需要建立连接
缺点 : 不稳定,不能保证每次数据都能接收
应用 :IP电话,实时视频会议,聊天软件,少量数据传输的场景
客户端和服务端在建立连接时 : 三次握手
客户端和服务端在断开连接时 : 四次挥手
SYN 创建连接
ACK 确认响应
FIN 断开连接
三次握手:
四次挥手:
MSL为最大报文段生存时间
默认规定MSL为2分钟,但实际应用中常用的是30秒,1分钟和2分钟等。
整体缩略图
socket模块
socket的意义 : 通络通信过程中,信息拼接的工具(中文:套接字)
TCP协议
基本语法
- server服务端
# ### socket 服务器 import socket # 创建一个socket对象 sk = socket.socket() # 绑定ip和端口(注册网络,让别人找到你) # "127.0.0.1" 默认本机的ip sk.bind( ("127.0.0.1",9000) ) # 开启监听 (等待别人连接服务器) sk.listen() ''' # 建立三次握手,建立连接 , 程序加了阻塞 , 建立三次握手如果失败,程序不往下执行 ''' conn,addr = sk.accept() print(conn,addr) # 最大一次性接受1024个字节.程序再次加了阻塞,没有接收到数据,不会向下执行代码 msg = conn.recv(1024) # 把字节流恢复成正常的字符串(解析字节流变成字符串) print(msg.decode("utf-8")) # 发送给客户端数据 conn.send(" 我真的好哟".encode("utf-8")) # 执行四次挥手,断开连接 conn.close() # 关闭socket对象,退还占用的端口号 sk.close()
- client客户端
import socket # 产生一个socket对象 sk = socket.socket() sk.connect( ("127.0.0.1",9000) ) # 发送消息 (发送的是二进制字节流) sk.send("你好么,我好哟".encode("utf-8")) # 接受消息 (发送完之后,程序加阻塞,等待服务器回应的数据,最大接受1024个字节) res = sk.recv(1024) strvar = res.decode("utf-8") print(strvar) # 关闭连接 sk.close()
可循环发送消息可退出
- server服务端
# ### 循环发消息 import socket sk = socket.socket() # 在网络中注册该主机 sk.bind( ("127.0.0.1",9001) ) # 监听端口 sk.listen() while True: # 建立三次握手 conn,addr = sk.accept() while True: res = conn.recv(1024) # 把字节流变成原本字符串 res2 = res.decode("utf-8") print(res2) strvar = input("你要发送给客户端什么消息呢?:") conn.send(strvar.encode("utf-8")) if strvar == "q": break # 执行四次挥手 conn.close() # 退还系统的9000端口 sk.close()
- client客户端
import socket sk = socket.socket() sk.connect( ("127.0.0.1",9001) ) while True: strvar = input("请输入您要发送的消息").strip() # 发送的数据需要二进制字节流 sk.send(strvar.encode("utf-8")) res = sk.recv(1024) if res == b"q": break print(res.decode("utf-8")) # 关闭连接 sk.close()