OSI参考模型
OSI参考模型是国际标准化组织分析计算机通信,把计算机通信进行的规范和标准化分成了7层:
1)应用层:所有能产生网络流量的程序(QQ,浏览器)
2)表示层:数据传输前的压缩,加密,确定编码方式等操作
3)会话层:查看木马(netstat -nb)只要需要网络请求,必定会建立会话
4)传输层:可靠传输,不可靠传输,流量控制
5)网络层:负责选择最佳路径,规划IP地址
6)数据链路层:帧的开始和结尾,透明传输,查看校验
7)物理层:接口标准,电器标准
TCP/IP协议
意为传输控制协议,由[网络层]的IP协议和[传输层]的TCP协议组成。
TCP协议
1)需要传输的文件分段传输
2)建立会话
3)可靠传输
4)流量控制
UDP协议
1)一个数据包就能完成数据通信
2)不需要建立会话
3)不可靠传输
4)不需要流量控制
URL(Uniform Resource Locator)
统一资源定位符
通过一个URL,就能找到互联网上唯一的1个资源
URL就是资源的地址,位置,互联网上的每个资源都有一个唯一的URL
URL的基本格式=协议://主机地址/路径
http://www.1000phone.com/img/logo.png
协议:http 不同的协议代表不同的资源查找方式,资源传输方式
主机地址:www.1000phone.com存放资源的主机(服务器)的IP地址(域名)
路径:img/logo.png 资源在主机(服务器)中的具体位置
HTTP:超文本传输协议,访问的是远程的网络资源,格式是http://
http协议是在网络开发中最常用的协议
作用是规定客户端和服务器之间的数据传输格式,让客户端和服务器能有效地进行数据沟通
完整的http通信分为两步:
请求:客户端向服务器索要数据
响应:服务器返回客户端相应的数据
请求包括请求头(客户端的环境描述,客户端请求信息)
请求体:客户端发给服务器的具体数据
响应包含响应头(服务器的描述,对返回数据的描述)
响应体:服务器返回给客户端的具体数据,比如文件
常见响应状态码
一.socket 编程
socket又叫套接字,就是进行数据通信两端,分为服务端套接字和客户端套接字
套接字编程:自己写服务器和客户端,进行数据传输
python对socket编程的支持:提供一个socket的库(内置)
写一个服务器
import socket
def creat_server():
"""写一个服务器"""
#1.创建套接字对象
"""
socket(family,type)
a.family:确定IP协议类型
AF_INET:ipv4(默认)
AF_INET6:ipv6
b.type:传输协议类型
SOCK_STREAM:TCP协议(默认)
SOCK_DGRAM:UDP协议
"""
server = socket.socket(family=socket.AF_INET,type=socket.SOCK_STREAM)
#2.绑定IP地址和端口
"""
bind((ip地址,端口))
端口:一台电脑上一个端口标记一个唯一的服务.范围0-65535,0-1024是著名端口,专门用来标记特殊服务,一般不用
但是,同一个端口同一时间只能绑定一个服务
"""
server.bind(('10.7.153.122',8080))
#3. 开始监听(监听的是客户端的请求)
"""
listen(最大个数)
同一时间能够连接的客户端的个数
"""
server.listen(512)
#4.让服务器处于运行状态
while True:
print('监听状态')
#5.连接客户端(建立连接),返回连接对象和客户端地址
#connect,addr = server.accept()这句代码会阻塞线程,直到有客户端来请求当前服务器为止
connect,addr = server.accept()
#6. 服务器给客户端发送消息
"""
send(data)
data:python3要求类型是bytes二进制,python2可以是字符串
补:
字符串(str)转二进制(bytes):
字符串.encode(编码方式默认utf-8)
bytes(字符串,encoding=)
"""
while True:
message=input('服务器:')
connect.send(message.encode())
#7.接受从客户端发送过来的消息
#注意:recv方法也会阻塞线程
"""
recv(bufsize)
bufsize:每次能够接收的最大的字节数
返回值:接收到的数据,类型是bytes
2.二进制转字符串:
二进制.decode()
str(二进制,编码方式)
"""
recv_data = connect.recv(1024)
#print(recv_data.decode())
print(str(recv_data,'utf-8'))
#8.断开连接
connect.close()
creat_server()
二.客户端套接字
import socket
def creat_client():
#1.创建套接字对象
client = socket.socket()
#2.连接服务器
"""
connect(服务器地址)
"""
client.connect(('10.7.153.127',8080))
while True:
#3.接收服务器发送的消息
data = client.recv(1024)
print(data.decode(encoding='utf-8'))
#4.给服务器发送消息
message = input("客户端:")
client.send(message.encode())
#5.断开连接
client.close()
creat_client()
三.图片传输
图片传输是一部分一部分接收的
import socket
# 1.创建套接字(创建一个座机)
server = socket.socket()
# 2.绑定地址(插电话线,绑定电话号码)
server.bind(('10.7.153.122',12345))
# 3.监听(人坐在电话旁)
server.listen(512)
#保证电话可以被打通(等电话)
while True:
# 4.接收请求(接电话)
connect,addr = server.accept()
# 5.发送数据(讲电话)
with open('./files/1.jpg','br') as f:
data = f.read()
connect.send(data)
# 6.接收数据(听)
#connect.recv(1024)
# 7.关闭连接(挂)
connect.close()
import socket
client = socket.socket()
client.connect(('10.7.153.122',12345))
#创建一个空的二进制数据
all_data = bytes()
#接收从服务器传回来的数据
data = client.recv(1024)
while data:
print('接收到数据')
all_data += data
data = client.recv(1024)
with open('./files/new.jpg','wb')as f:
f.write(all_data)
client.close()
四.http请求
import requests
#1.准备url
url = 'https://www.apiopen.top/satinApi?type=1&page=1'
#2.发送请求(GET请求)
"""
get(url,参数对应的字典)
post(url,参数对应的字典)
返回值是服务器返回的响应
"""
response = requests.get(url)
#requests.get('https://www.apiopen.top/satinApi',{'type':1,'page':1})
print(response)
#3.通过响应获取服务器返回的数据
#a.获取字符串类型的数据
print(response.text)
#b.获取json格式的数据
print(response.json()['msg'])
print(response.json())
#c.获取二进制格式的数据
print(response.content)
#{'Server': 'nginx', 'Date': 'Wed, 12 Sep 2018 09:06:56 GMT', 'Content-Type': 'application/json;charset=utf-8', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': 'POST, GET, OPTIONS, DELETE', 'Access-Control-Max-Age': '3600', 'Access-Control-Allow-Headers': 'x-requested-with'}
#4.获取响应头(了解)
print(response.headers)