OSI参考模型:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层
TCP/IP协议(栈/簇):OSI参考模型中涉及得所有协议
HTTP、TCP和UDP(HTTP是基于TCP的,DNS基于UDP)TCP:可靠传输、建立会话、大数据可以分段传输(可以实现长连接)
UDP:不可靠传输、不会建立会话(不是长连接)、数据一次传完,不会分段
-
HTTP:给客户端发送的请求和服务器的响应醉了规范和要求.
- 请求:需要发送请求头和请求体
- 响应:需要返回响应头和响应体
URL:统一资源定位符
协议命://主机地址(ip地址,域名)/路径(资源在服务器上的相对路径)GET和POST:对参数的传输方式不一样
socket:写服务端(船舰服务端对应的套接字→绑定ip和端口→监听---接收请求,TCP建立会话,发送和接受数据)
写客户端(创建客户端对应的套接字→连接服务器---发送和接收数据)requests模块,第三方模块.
socketServer
"""__author__ == Jefferson"""
'''
socket编程(套接字): 指通过代码来创建实现通信的两个端, (服务器和客户端)
socket一般可以基于TCP和UDP实现客户端和服务器之间的可靠传输和不可靠传输
python中的内置模块socket可以支持socket编程
'''
import socket
if __name__ == '__main__':
#1. 创建服务器套接字对象
'''
family: 确定服务类型
AF_INET: ipv4(默认)
AF_INET6: ipv6
type: 确定传输协议类型
SOCK_STREAM: TCP协议(默认)
SOCK_DGRAM: UDP协议
'''
#server = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
server = socket.socket()
#2. 绑定ip地址和端口
'''
地址格式: ('ip地址字符串', 端口号)
端口号: 用来区分计算机中不同的服务, 范围是0-65535
注意: 1. 其中0-1024是'著名端口'用来便绑定一些特殊服务, 平时一般不使用
2. 同一时间, 一个端口只能绑定一个服务
'''
server.bind(('10.7.181.85', 8080))
#3. 监听请求
'''
参数: 用来限制一次性能够接收的客户端请求数量
'''
server. listen(30)
print('开始监听请求')
#保证服务器一直处于启动状态
while True:
#4. 接收客户端的请求
'''
accept()会阻塞线程, 直到有客户端给这个服务器发送请求, 才会开始执行
'''
client, addr = server.accept()
print(addr)
#5. 给客户端发送消息
'''
send(数据): 数据必须是二进制(bytes)类型
字符串转二进制:
1. bytes('字符串',encoding='编码方式')
2. 字符串.encode(encoding='编码方式'
'''
with open('./2.jpg', 'rb') as file:
data = file.read()
client.send(data)
# client.send(bytes('HTTP/1.1 200 0K\r\n\r\n',encoding='utf-8'))
# client.send(bytes("I'm PSL, I will control you equipment!",encoding='utf-8'))
#接收从客户端发来的消息
'''
bufsize: 设置缓存大小(单位是字节)
1024字节
二进制转换成字符串
1. str(二进制数据,encoding='utf-8)
2. data.decode(encoding='utf-8')
'''
# data = client.recv(1024)
# str1 = str(data, encoding='utf-8')
# str2 = data.decodde(encoding='utf-8')
# print(str1)
#6. 关闭连接
client.close()
socketClient
"""__author__ == Jefferson"""
import socket
if __name__ == '__main__':
#1. 创建套接字对象
client = socket.socket()
#2. 连接服务器
client.connect(('10.7.181.85', 8080))
#3. 接收信息
# data = client.recv(1024)
# print('接收到服务器的数据:', data.decode(encoding='utf-8'))
img = bytes()
img_data = client.recv(1024)
while img_data:
img += img_data
img_data = client.recv(1024)
with open('./21.jpg','wb') as file:
file.write(img)
#4. 发送消息
client.send('你好服务器'.encode(encoding='utf-8'))
client.close()
两人互发信息
server
"""__author__ == Jefferson"""
import socket
if __name__ == '__main__':
#1. 创建对象
server = socket.socket()
#2. 绑定地址
server.bind(('10.7.181.85', 8089))
#3. 监听
server.listen(50)
while True:
conversation, addr = server.accept()
print(addr)
#让客户端和服务器一直处于连接的状态
while True:
#发消息
message = input('>>>')
conversation.send(message.encode())
#接收消息
mesasge_data = conversation.recv(1024)
print(mesasge_data.decode(encoding='utf-8'))
client
"""__author__ == Jefferson"""
import socket
if __name__ == '__main__':
#1. 创建套接字对象
client = socket.socket()
#2. 连接服务器
client.connect(('10.7.181.92',8085))
while True:
# 接收消息
data = client.recv(1024)
print(data.decode(encoding='utf-8'))
# 发送消息
message = input('>>>')
client.send(message.encode())
http
"""__author__ == Jefferson"""
'''
服务器:python\java\php等等
HTTP(为了可以让客户端和服务器能够进行有效的数据交流)
客户端: 网页(js), 应用(java, oc/swift)
python中访问网络中的数据: 第三方库request
'''
from requests import request
if __name__ == '__main__':
#1. 确定url https://www.apiopen.top/satinApi?type=1&page=1
#GET请求: 参数以?的形式拼接到url地址后面, 参数名=值得形式,多个参数用&隔开
url = 'https://www.apiopen.top/satinApi?type=1&page=1'
#2. 发送请求
response = request('GET', url)
print(type(response),response)
#以字符串的形式获取响应体(服务器返回的数据)
text = response.text
print(type(text),text)
#以json的形式获取响应体
json =response.json()
print(type(json),json)
#以二进制的形式获取响应体
content = response.content
print(type(content),content)
练习
server
"""__author__ == Jefferson"""
import socket
import re
from requests import request
if __name__ == '__main__':
server = socket.socket()
server.bind(('10.7.181.85',8080))
server.listen()
while True:
conversation, address = server.accept()
print(address,'已连接')
while True:
# 接收消息
message_a = conversation.recv(1024)
message_a = message_a.decode(encoding='utf-8')
re_str = r'(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?'
web_match = re.fullmatch(re_str+' ',message_a)
if web_match != None:
response = request('GET', web_match.group()[:-1])
re_str = r'.+\.(JPG|JPEG|GIF|PNG|jpg|jpeg|gif|png)'
img_match = re.fullmatch(re_str + ' ', message_a)
if img_match != None:
print(img_match.group())
with open('./file/'+re.search(r'[^\%]\w+\.\w+ ', img_match.group()).group()[:-1], 'wb') as file:
file.write(response.content)
else:
print(web_match.group())
with open('./file/text.txt','w') as file:
file.write(response.text)
print(message_a)
#发消息
message = input('>>>')
conversation.send(message.encode())
client
"""__author__ == Jefferson"""
import socket
if __name__ == '__main__':
client = socket.socket()
client.connect(('10.7.181.85',8080))
while True:
# 发送消息
message_a = input('>>>')
client.send(message_a.encode())
if message_a == '拜拜':
break
#接收消息
message = client.recv(1024)
print(message.decode(encoding='utf-8'))
client.close()