Python进阶系列
Python进阶-网络编程-01
Python进阶-网络编程-02
Python进阶-网络编程-03
Python进阶-多任务编程-01
Python进阶-多任务编程-02
Python进阶-多任务编程-03
Python进阶-正则表达式
Python进阶-数据库编程-01
Python进阶-数据库编程-02
Python进阶-数据库编程-03
Python进阶-数据库编程-04
Python进阶-数据拷贝问题
Python进阶-模块导入问题
Python进阶-miniWeb框架
文章目录
4.1. tcp简介
- 定义:TCP是面向连接的、可靠的、基于字节流的传输控制协议
- TCP的特点:
- 面向连接
- 可靠传输
- 应答机制
- 超时重传
- 错误校验
- 流量管控
- TCP通信模型:TCP严格区分客户端、服务端
4.2. tcp网络程序-客户端
-
代码示例:
# 1.导入socket模块 import socket # 2.创建socket套接字 tcp_client_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 3.建立tcp连接(和服务端建立连接) tcp_client_socket.connect(("192.168.70.1",8080)) # 4.开始发送数据(到服务端) tcp_client_socket.send("约吗".encode("gbk")) # 5.接收数据 recv_data = tcp_client_socket.recv(1024) print(recv_data.decode("gbk")) # 6.关闭套接字 tcp_client_socket.close()
4.3. tcp网络程序-服务器
-
listen()函数
# 开启监听,把套接字由主动变为被动,128代表客户端最大连接数量 tcp_server_socket.listen(128)
-
accept()函数
# accept开始等待客户端连接,程序进入阻塞状态 new_client_socket,client_ip_port = tcp_server_socket.accept() new_client_socket 新的套接字,只是服务当前的客户端 client_ip_port 客户端端口和ip地址
-
代码示例:
import socket # 1.socket创建一个套接字 tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 2.绑定端口 tcp_server_socket.bind(("",8080)) # 3.listen使套接字变为可以被动链接(监听模式) # 128代表最大连接客户端的数量,windows系统有效,linux系统无效 tcp_server_socket.listen(128) # 4.accept等待客户端的链接 # accept开始等待客户端连接,程序进入阻塞状态 new_client_socket,client_ip_port = tcp_server_socket.accept() print("新客户端来了:%s" % str(client_ip_port)) # 5.recv/send接收发送数据 recv_data = new_client_socket.recv(1024) print("接收到[%s]的信息:%s" % (str(client_ip_port),recv_data.decode("gbk"))) # 表示不再和当前的客户端通信 new_client_socket.close() # 表示程序不再接受新的客户端的连接,已经连接的可以继续服务 tcp_server_socket.close()
4.4. tcp网络程序-服务器增强
-
代码示例:
import socket # 1.socket创建一个套接字 tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 2.bind绑定ip和pot tcp_server_socket.bind(("",8080)) # 3.listen使套接字变为可以被动链接(监听模式) # 128代表最大连接客户端的数量,windows系统有效,linux系统无效 tcp_server_socket.listen(128) while True: # 4.accept等待客户端的链接 # accept开始等待客户端连接,程序进入阻塞状态 new_client_socket,client_ip_port = tcp_server_socket.accept() print("新客户端来了:%s" % str(client_ip_port)) # 5.recv/send接收发送数据 while True: recv_data = new_client_socket.recv(1024) # 当接收数据为空时,表示客户端已经断开,服务器也应该断开 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() # 表示程序不再接受新的客户端的连接,已经连接的可以继续服务 tcp_server_socket.close()
4.5. 案例:文件下载器
-
下载过程
""" D:/mydocument/Python/源文件/02_python进阶/day04/1.txt to d:/Users/Desktop/1.txt """
-
客户端:
- 导入模块
- 创建套接字
- 建立连接
- 接收用户输入的文件名
- 发送文件名到服务端
- 创建文件,并且准备保存
- 接收服务端发送的数据,保存到本地(循环)
- 关闭套接字
# 1.导入模块 import socket # 2.创建套接字 tcp_client_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 3.建立连接 tcp_client_socket.connect(("127.0.0.1",8080)) # 4.接收用户输入的文件名 file_name = input("请输入下载的文件名:\n") # 5.发送文件名到服务端 tcp_client_socket.send(file_name.encode("gbk")) # 6.创建文件,并且准备保存 with open("d:/Users/Jq/Desktop/"+file_name,"wb") as file: # 7.接收服务端发送的数据,保存到本地 while True: file_data = tcp_client_socket.recv(1024) if file_data: file.write(file_data) else: break # 8.关闭套接字 tcp_client_socket.close()
-
服务器:
- 导入模块
- 创建套接字
- 绑定端口
- 设置监听,设置套接字由主动为被动
- 接受客户端连接
- 接收客户端发送的文件名
- 根据文件名读取文件内容
- 把读取的内容发送给客户端(循环)
- 关闭和当前客户端的连接
- 关闭服务器
# 1.导入模块 import socket # 2.创建套接字 tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 消除2MSL的等待 MSL:报文最大生存时间 tcp_server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True) # 3.绑定端口 tcp_server_socket.bind(("",8080)) # 4.设置监听,设置套接字为被动 tcp_server_socket.listen(128) # 5.接收客户端连接 while True: new_client_socket,ip_port = tcp_server_socket.accept() print("欢迎新客户端",ip_port) # 6.接收客户端发送的文件名 recv_data = new_client_socket.recv(1024) file_name = recv_data.decode("gbk") print(file_name) try: # 7.根据文件名读取文件内容 with open(file_name,"rb") as file: # 8.把读取的内容发送到客户端 while True: file_data = file.read(1024) if file_data: new_client_socket.send(file_data) else: break except Exception as e: print("下载%s失败" % file_name) else: print("下载%s成功" % file_name) # 9.关闭和当前客户端的连接 new_client_socket.close() # 10.关闭套接字 tcp_server_socket.close()
4.6. tcp的3次握手
- 概念:三次握手是TCP建立连接的时候发送的三个数据包
- 概念
- 简单描述通信过程
- 必须是3次,如果少于3次,会造成系统资源的浪费
4.7. tcp的4次挥手
- 概念:TCP断开连接的时候发送的4个数据包,确保断开连接
- 概念
- 简单描述过程
- 必须是4次
- 主动发起断开的一方,必须等待2MSL时间
4.8. IP地址和域名
- ip地址
- ip地址网络中计算机的唯一标识,点分10进制构成
- ipv4和ipv6
- 域名
- Doman name
- 因为网络通信需要使用ip地址,但是ip地址不容易记忆,所以才有了更好记忆的域名
- 特殊域名:localhost
4.9. DNS及浏览器请求服务器的过程
- 浏览器输入网址–>本地DNS服务器查询ip–>远程DNS服务器–>建立TCP连接
- 本地DNS服务器是一个文件
- Windows C:\Windows\System32\drivers\etc\hosts
- Ubuntu /etc/hosts
4.10. HTTP协议概述
-
定义:http 协议,超文本传输协议,主要用来发布和传输html页面(网页)
-
http协议组成:
- 请求协议
- 响应协议
-
http协议构成:
-
由协议项来构成
-
协议项:
- 协议名
- 协议值
-
4.11. HTTP协议格式查看
- 谷歌
- 右键–>检查–>network–>刷新
- 更多–>开发者工具
- F12
- 火狐
- 右键–> 检查元素–>网络–>刷新
4.12. HTTP请求报文格式
-
请求报文格式
-
请求行
- 请求方式 资源路径 协议及版本\r\n
-
请求头
-
协议项
协议名:协议值\r\n
-
-
请求空行
- 作用:分隔请求头和请求的主体
-
请求主体
- 浏览器要发给服务器的内容
- get方式没有请求体,post方式才有请求体
-
4.13. HTTP响应报文格式
-
响应报文格式
-
响应行
-
协议及版本 状态码 状态描述\r\n
常见的状态码
200 一切正常
404 客户端请求的资源不存在
302 重定向
-
-
响应头
-
协议项构成
协议名:协议值\r\n
-
-
响应空行
- 作用:分隔响应头和响应主体
-
响应主体
- 服务器响应给客户端的数据
-
4.14. 长连接和短连接
-
长连接:一次连接,多次数据传输,通信结束关闭连接
特点:要不连不上,一旦连接上,速度有保证,当瞬间访问压力比较大的时候,服务器不可用
-
短连接:一次连接,一次传输,就关闭
特点:会频繁的建立和断开连接,当瞬间访问压力比较大的时候,服务器响应过慢