day18 - http/TCP/IP(总结)

1.recode

1.1.正则符号
a.匹配字符
. \w \s \d \W \S \D [字符集][^字符集]
b.边界检测
\b ^ $
c.匹配次数
\+ \* ? {} 贪婪?
d.分之、分组
|
() - 分组,捕获,重复
e.转义符号
特殊符号前加\
2.2.re模块
fullmatch() - 检测一个字符串是否是ip/检测账号密码是否符合要求/检测输入的内容是否是手机号,邮箱
match() - 检测字符串开头是否满足要求 - 匹配对象
search() - 判断字符串中是否存在满足要求的子串 - 匹配对象
split() - 字符串切割
sub() - 字符串替换
findall() - 获取子串
finditer() - 获取所有的匹配结果,返回值是迭代器

2.socket编程

socket又叫套接字,指的就是实现通信过程的两个端。等待请求的一端叫服务器套接字,发送请求的一端叫客户端套接字
python中提供了socket模块来支持socker编程。
2.1.服务器套接字
a.创建套接字对象
socket(family,type)
family - 设置IP类型 AF_INET(默认值) - IPv4, AF_INET6 - IPv6
type - 设置传输类型 SOCK_STREAM - TCP SOCK_DGRAM - UDP

创建一个基于IPV4和TCP的套接字对象
server = socket.socket()

b.绑定IP地址和端口
bind((IP,端口号))
IP地址 - 服务器对应的计算机的IP地址,字符串
端口号 - 用来区分计算机上不同的服务;是一个数字,范围是0-65535.但是其中1024及以下的是著名端口,
用来表示一些特殊的服务,一般不要用
同一个时间一个端口只能对应一个服务

server.bind(('10.7.187.105', 8100))

c.开始监听
listen(最大监听数)
最大监听数 - 用来设置当前服务器一次可以处理多少个请求

server.listen(100)
print('开始监听')

d.让服务器一直处于启动状态

while True:
    # 接收客户端发送的请求,返回请求地址和会话对象;注意:程序代码会阻塞线程(程序运行到这儿会停下来
    # ,直到有客户端给当前服务器发送请求为止)
    conversation, addr = server.accept()
    print('接受到请求:', addr)
    # 接收消息(客户端发送给服务器的消息)
    """
    recv(缓存大小) - 获取客户端个服务器发送的数据,返回值是二进制
    缓存大小 - 决定一次可以接收的数据最大字节数
    这儿也会阻塞线程
    """
    re_data = conversation.recv(1024)
    print(re_data.decode('utf-8'))
    # 发送数据(服务器给客户端发送数据)
    """
    send(数据) - 将指定的数据发送给客户端
    数据 - 要求是二进制
    字符串转二进制
    a.bytes(字符串,'utf-8')
    b.字符串.encode('utf-8')
    二进制转字符串
    a.str(二进制数据,'utf-8')
    b.二进制.decode('utf-8')
    """
    message = 'HTTP/1.1 200 OK 你好!'
    conversation.send(message.encode('utf-8'))
    # 关闭连接
    conversation.close()

2.2客户端套接字
a.创建套接字对象

client = socket.socket()

b.连接服务器
connect((IP,端口))

client.connect(('10.7.187.105', 8100))

c.发送消息

message= input('输入:')
client.send(message.encode('utf-8')

d.接收消息

re_data = client.recv(1024)
print(re_data.decode('utf-8'))

3.请求网络数据

python中去做http请求,需要使用一个第三方库,requests
3.1.向服务器发送get请求
a.手动拼接url

url = 'https://www.apiopen.top/satinApi?type=1&page=1'
response = requests.get(url)
print(response)

b.自动拼接url

url = 'https://www.apiopen.top/satinApi'
response = requests.get(url, {'type': 1, 'page': 1})
print(response)

3.2.获取结果
a.获取响应头

header = response.headers
print(header)

b.获取响应体
1)获取二进制格式的响应体

content = response.content
print(content)

2)获取json格式响应体 - 自动将json数据转换成python

content = response.json()
print(content)

3)获取字符串格式的响应体

content = response.text
print(content)
# 应用;下载一个网络图片
url = 'https://timgsa.baidu.com/timg?image&quality=80&size=b10000_' \
      '10000&sec=1543395098&di=2a5bbaa5600097b050ba69a688672de9&src=http' \
      '://p0.qhimgs4.com/t0112e7ebfdef7f923d.jpg'
response = requests.get(url)
image_data = response.content
with open('王也.jpg', 'wb') as f:
    f.write(image_data)

4.附加知识(网络基础/HTTP)

一、HTTP

1.1.什么是URL
URL又叫统一资源定位符
URL的基本格式 = 协议://主机地址/路径
协议:不同的协议,代表着不同的资源查找方式、资源传输方式(http,file,ftp,mailto)
主机地址:存放资源的主机(服务器)的IP地址(域名)
路径:资源在主机(服务器)中的具体位置
1.2.URL中常见的协议
http:超文本传输协议,访问的是远程的网络资源,格式是http://
file:访问的是本地计算机上的资源,格式是file://(不用加主机地址)
mailto:访问的是电子邮件地址,格式是mailto:
ftp:访问的是共享主机的文件资源,格式是ftp://
1.3.http的通信过程
完整的http通信可以分为2大步骤:
1)请求:客户端向服务器索要数据
HTTP协议规定:1个完整的由客户端发给服务器的HTTP请求中包含以下内容:
a.请求头:包含了对客户端的环境描述、客户端请求信息等
GET /minion.png HTTP/1.1 // 包含了请求方法、请求资源路径、HTTP协议版本
Host: 120.25.226.186:32812 // 客户端想访问的服务器主机地址
User-Agent: Mozilla/5.0 // 客户端的类型,客户端的软件环境
Accept: text/html, / // 客户端所能接收的数据类型
Accept-Language: zh-cn // 客户端的语言环境
Accept-Encoding: gzip // 客户端支持的数据压缩格式
b.请求体:客户端发给服务器的具体数据,比如文件数据(POST请求才会有)
2)响应:服务器返回客户端相应的数据
客户端向服务器发送请求,服务器应当做出响应,即返回数据给客户端
HTTP协议规定:1个完整的HTTP响应中包含以下内容:
a.响应头:包含了对服务器的描述、对返回数据的描述
HTTP/1.1 200 OK // 包含了HTTP协议版本、状态码、状态英文名称
Server: Apache-Coyote/1.1 // 服务器的类型
Content-Type: image/jpeg // 返回数据的类型
Content-Length: 56811 // 返回数据的长度
Date: Mon, 23 Jun 2014 12:54:52 GMT // 响应的时间
b.响应体:服务器返回给客户端的具体数据,比如文件数据
1.4.常见的状态码

HTTP常见状态码

1.5.发送HTTP请求的方法
在HTTP/1.1协议中,定义了8种发送http请求的方法
GET、POST、OPTIONS、HEAD、PUT、DELETE、TRACE、CONNECT、PATCH
根据HTTP协议的设计初衷,不同的方法对资源有不同的操作方式
PUT :增
DELETE :删
POST:改
GET:查
最常用的是GET和POST(实际上GET和POST都能办到增删改查)
要想使用GET和POST请求跟服务器进行交互,得先了解一个概念
参数
就是传递给服务器的具体数据,比如登录时的帐号、密码
1.6.GET和POST对比
GET和POST的主要区别表现在数据传递上
GET
在请求URL后面以?的形式跟上发给服务器的参数,多个参数之间用&隔开,比如
http://www.test.com/login?username=123&pwd=234&type=JSON
由于浏览器和服务器对URL长度有限制,因此在URL后面附带的参数是有限制的,通常不能超过1KB
POST
发给服务器的参数全部放在请求体中
理论上,POST传递的数据量没有限制(具体还得看服务器的处理能力)

二、网络基础

2.1.OSI参考模型
OSI模型是国际标准化组织分析计算机通信,把计算机通信进行的规范
和标准化分成了7层:
应用层:所有能产生网络流量的程序(QQ,浏览器、有道)
表示层:数据传输前的压缩、加密、确定编码方式等操作
会话层:查看木马(netstat -nb)(只要需要网络请求,就必定会建立会话)
传输层:可靠传输、不可靠传输、流量控制
网络层:负责选择最佳路径、规划IP地址

数据链路层:帧的开始和结尾、透明传输、查错校验
物理层:接口标准、电器标准

OSI参考模型

数据封装过程

数据解封过程

TCP/IP协议通信过程

2.2.传输层的两个协议
在TCP/IP协议栈,传输层有两个协议:TCP和UDP
TCP协议(Transmission Control Protocol,传输控制协议)

  1. 需要传输的文件分段传输
  2. 建立会话
  3. 可靠传输
  4. 流量控制
    UDP协议(User Data Protocol,用户数据报协议)
  5. 一个数据包就能完成数据通信
  6. 不需要建立会话
  7. 不可靠传输
  8. 不需要流量控制

TCP的可靠传输:


TCP的可靠传输

你可能感兴趣的:(day18 - http/TCP/IP(总结))