4.1. 内容回顾
4.2. [重点]tcp简介
-
TCP 面向连接、可靠的、基于字节流的传输控制协议
-
TCP的特点
- 面向连接
- 可靠传输
- 应答机制
- 超时重传
- 错误校验
- 流量管控
-
TCP通信模型
TCP严格区分客户端、服务端
4.3. [重、难点]tcp网络程序-客户端
-
实现步骤
-
导入模块
-
创建套接字
socket.SOCK_STREAM
-
建立连接
tcp_client_socket.connect( (“服务端ip”, 服务端端口) )
-
发送数据
tcp_client_socket.send(“内容”.encode())
-
接收数据
recv_data = tcp_client_socket.recv(1024)
recv_data 是接收到的数据的二进制
-
关闭连接
-
4.4. [重、难点]tcp网络程序-服务器
-
导入模块
-
创建套接字
-
绑定端口
-
开启监听(把套接字由主动设置为被动模式)
tcp_server_socket.listen(128) 最大允许128个连接
-
等待客户端连接
new_client_socket,client_ip_port = tcp_server_socket.accept()
new_client_socket 新的套接字,只是服务当前的客户端
client_ip_port 客户端端口和ip地址
-
使用新的套接字接收客户端发送的信息
new_client_socket.recv(1024)
-
关闭新的套接字
new_client_socket.close() 关闭和当前客户端的连接
-
关闭服务器套接字
tcp_server_socket.close() 服务器不再接收新的客户端,老客户端可以继续服务
4.5. [重、难点]tcp网络程序-服务器增强
-
循环接收多条信息
while True: # recv() 会让程序再次阻塞,收到信息后再接阻塞 recv_data = new_client_socket.recv(1024) # 当接受到数据为空的时候,表示客户端已经断开连接了,服务端也要断开 # if len(recv_data)!= 0: # b'xxxx' # 如果recv_data 非空即为真,否则为假 if recv_data: recv_text = recv_data.decode("GBK") print("接收到[%s]的信息:%s" % (str(client_ip_port), recv_text)) else: print("客户端已经断开连接!") break
-
循环接受多个客户端连接
while True: new_client_socket, client_ip_port = tcp_server_socket.accept() print("新客户端来了:%s" % str(client_ip_port)) # 6、收发数据 while True: # recv() 会让程序再次阻塞,收到信息后再接阻塞 recv_data = new_client_socket.recv(1024) # 当接受到数据为 空 的时候,表示客户端已经断开连接了,服务端也要断开 # if len(recv_data)!= 0: # b'xxxx' # 如果recv_data 非空即为真,否则为假 if recv_data: recv_text = recv_data.decode("GBK") print("接收到[%s]的信息:%s" % (str(client_ip_port), recv_text)) else: print("客户端已经断开连接!") break # new_client_socket.close() 表示不能再和当前的客户端通信了 new_client_socket.close()
注意:必须等待第一个客户端断开后,第二个客户端才能有机会连接
4.6. [重、难点]案例:文件下载器(一)
-
客户端
目标:
/home/demo/Document/python_projects/day04/1.txt
下载到
/home/demo/Desktop/1.txt1、导入模块
2、创建套接字
3、建立连接
4、接收用户输入的文件名
5、发送文件名到服务端
6、创建文件,并且准备保存
7、接收服务端发送的数据,保存到本地(循环)
8、关闭套接字 -
服务器:
1、导入模块
2、创建套接字
3、绑定端口
4、设置监听,设置套接字由主动为被动
5、接受客户端连接
6、接收客户端发送的文件名
7、根据文件名读取文件内容
8、把读取的内容发送给客户端(循环)
9、关闭和当前客户端的连接
10、关闭服务器
4.7. [重、难点]案例:文件下载器(二)
-
with open(“文件名”, 打开方式) as file
file = open(文件名,打开方式)
4.8. tcp的3次握手
- 三次握手是TCP建立连接的时候发送的三个数据包
1、概念
2、简单描述通信过程
3、必须是3次,如果少于3次,会造成系统资源的浪费
4.9. tcp的4次挥手
-
四次挥手,指的TCP断开连接的时候发送4个数据包,确保断开连接
1、概念
2、简单描述过程
3、必须是4次 (新连接收到老的数据包)
4、主动发起断开的一方,必须等待2MSL时间
4.10. IP地址和域名
- ip地址
- ip地址网络中计算机的唯一标识,点分10进制构成
- ipv4和ipv6
- 域名
- Doman name
- 因为网络通信需要使用ip地址,但是ip地址不容易记忆,所以才有了更好记忆的域名
- 特殊域名:localhost
4.11. DNS及浏览器请求服务器的过程
- 浏览器–输入网址–>本地DNS服务器查询ip–>远程DNS服务器–>建立TCP连接
- 本地DNS服务器是一个文件
- Windows C:\Windows\System32\drivers\etc\hosts
- Ubuntu /etc/hosts
4.12. HTTP协议概述
-
http 协议,超文本传输协议,主要用来发布和传输html页面(网页)
-
http协议2部分构成:
- 请求协议
- 响应协议
协议由协议项来构成
协议项:1)协议名 2)协议值
4.13. [重点]HTTP协议格式查看
- 谷歌
- 右键–>检查–>network–>刷新
- 更多—》开发者工具
- F12
- 火狐
- 右键–> 检查元素–》网络–》刷新
4.14. [重点]HTTP请求报文格式
-
请求报文格式
-
请求行
请求方式 资源路径 协议及版本\r\n
-
请求头
协议项
协议名: 协议值 \r\n
-
请求空行
请求空行的作用:分隔请求头和请求的主体
-
请求主体
浏览器要发送给服务端的内容
get方式没有请求体,post方式才有请求体
-
4.15. [重点]HTTP响应报文格式
-
响应协议
-
响应行
协议及版本 状态码 状态描述\r\n
常见状态码:
200 一切正常
404 客户端请求的资源不存在
302 重定向
-
响应头
协议项构成
协议名 : 协议值\r\n
-
响应空行
分隔响应头和响应 主体
-
响应主体
服务器响应给客户端的数据
-
4.16. 长连接和短连接
-
长连接
一次连接,多次数据传输,通信结束关闭连接
特点:
要不连不上,一旦连接上,速度有保证,当瞬间访问压力比较大的时候,服务器不可用
-
短连接
一次连接,一次传输,就关闭
特点:
会频繁的建立和断开连接,当瞬间访问压力比较大的时候,服务器响应过慢