day19网络通信过程TCP/IC协议
网络通信过程
socket又叫套接字,指的是实现网络通信的两端。分为服务器对应的套接字和客户端对应的套接字
python 通过提供socket标准库来支持socket编程。
socket编程就是用程序实现服务器和客户端
服务器.bind(())给服务器绑定ip和端口
客户端.connect(()) 给客户端绑ip和端口
send发送 recv 接收
str.encode('utf-8') 字符串转二进制 send的时候
bytes.docode('utf-8')二进制转字符串 recv的时候
服务器发送接收的时候要用 conversation.send/recv
1.写一个socket服务器程序
import socket
#1.创建服务器对应的套接字对象(买了一个电话座机)
server=scoket.scoket()
#scoket有两个默认值参数。scoket(family=ipv4,type=TCP可靠传输)
# 创建一个基于ipv4的可靠服务器的套接字#已经有了默认值ipv4和TCP
2.绑定ip和端口(插了一根电话线-确定电话号码)
bind((ip,端口)) 参数是一个元组
ip:服务器的地址
端口: 不同的端口用来区分电脑上不同服务。取值范围是0-65535,注意0-1024属于著名端口
著名端口-->用来绑定特殊服务的端口,不要随便用
同一时间同一端口稚嫩绑定一个端口
server.bind(('10.7.156.23',32534))
- 监听请求(交电话费)
listen(个数)---> 需要通过数字来设置服务器一次可以处理的最大的请求个数
server.listen(666)
print('开始监听')
4.让服务器一直处于开启状态
send(data)--->发送数据
data: 需要发送的数据,要求是二进制数据(bytes)
字符串转二进制
a.str ---> bytes:
1.bytes(字符串,enconding='utf-8')
2.字符串.encode(编码方式)
#conversation,addr = server.accept
#接收客户端请求,如要一直开启就用while true循环
While True:
conversation,addr = server.accept
#打印请求地址
print(addr)
# 服务器给客户端发送数据(开始说话)
message = input('服务器:')
message_data = message.encode('utf-8')#输入的信息转换成二进制
conversation.send(message_data)#发送二进制文件
5.接收客户端发送的消息
data = conversation.recv(1024)# 1024表示一次接收的数据大小
re_message = data.decode('utf-8')#将接收到的二进制文件转换成str
print(re_message)
recv(字节数) ---> 接受从客户端发送的数据,参数是用来设置一次能接收的最大字节数
返回值是接收到的数据,数据是二进制
bytes 转 字符串
str()
二进制.decode()
注意:recv方法也会阻塞线程,程序运行到这儿也会停止运行,等到对方发送消息为止
2.socket客户端
import socket
client = socket.scoket()#创建套接字对象
#连接服务器
client.connect(('10.7.156.23',32534))
#给服务器发送消息
message =input( '客户端说:')
client.send(message.encode('utf-8'))
if message == '拜拜'
break #说拜拜让程序结束
# 接收服务器返回数据
new_message = client.recv(1024)
print(‘客户端说:’+new_message.decode('utf-8'))
3.给服务器升级(持续运行)
import scoket
server = scoket.scoket() #创建服务器
server.bind(('10.7.156.23',32534)) # 绑定ip
server.listen(199)#设置监听请求次数
# 用一个while True循环来持续运行服务器
while True:
conversation,addr = server.accept()
print(addr)
while True:
message_re =conversation.recv(1024).docode('utf-8')#接收消息,二进制转字符串
print(''客户端%s:' % addr[0][-2:]'+message)
message = input('服务器说:')
conversation.send(message.encode('utf-8'))
4.接收图片的客户端
import socket
client = scoket.scoket()
client.connect(('10.7.156.23',32534))
message = client.recv(1024) #接收到的二进制文件
data = bytes()
while message:
data += message
message = client.recv(1024)
with open('.aaa.jpg','wb')as f:
f.write(data)
print('接收完成')
#==================服务器发送文件==============
with open('.bbb.jpg''rb')as f:
message = f.read()
conversation.send(message)
conversation.close()#这里要主动关闭图片文件
5.requests请求
Python没有一个标准库来支持网络请求,但目前有一个第三方库支持http请求
requests.get(url,parmas) --> 返回服务的响应
url-->请求地址
params---> 客户端给服务器发送的数据(字典){参数名:值}
import resquests
url = 'https://www.apiopen.top/satinApi?type=1&page=1'
response = requests.get(url)
# 1. 获取响应头
print(response.headers)
# 获取响应头
print(response.hearders)
# 2.拿二进制形式的响应体
data_byte = response.content
print(data_byte,type(data_byte))
# 3.拿字符串形式的响应体
data_text = response.text
print(type(data_text),data_text)
# 4.拿json格式对应的python数据
data_json = response.json()
print(type(data_byte))
image_message = resquests.get('http://img4.imgtn.bdimg.com/it/u=4097616506,16220324&fm=200&gp=0.jpg')
re_image = image_message.content# 拿到响应体的二进制
with open ('.aaa.jpg','wb') as f:
f.write(re_image)
6.http
URL基本格式 = 协议://主机地址/路径
url协议
HTTP,超文本传输协议,访问远程的网络资源,格式是http://
是最常用的协议
特点:
简单快速。因为http协议简单,所有http服务器的程序规模小,因为通信速度很快
灵活。 http允许传输各种各样的数据
http 0.9和1.0 使用非持续连接
限制每次连接只处理一个请求,服务器对客户端的请求做出相应,马上断开连接。
通信过程
200 OK 请求成功
400 Bad Request 客户端请求语法错误,服务器无法解析
404 无法找到客户端请求的资源
500 服务器内部错误
TCP/IC协议
OSI参考模型 | TCP/IC协议栈 | 分层 |
---|---|---|
应用层 | HTTP/HTTPS\(网络请求) | 前三个都属于应用层 |
表示层 | HTTP/HTTPS\(网络请求) | FTP DNS |
会话层 | HTTP/HTTPS\(网络请求) | |
传输层 | TCP(可靠传输)UDP(不可靠传输) | 传输层 |
网络层 | ARP IP ICMP IGMP | 网络层 |
数据链路层 | Ethernet ATM Frame Replay | 数据链路层 |
物理层 | Ethernet ATM Frame Replay | 物理层 |
应用层:所有能产生网络流量的程序(QQ,浏览器、有道)
表示层:数据传输前的压缩、加密、确定编码方式等操作
会话层:查看木马(netstat -nb)(只要需要网络请求,就必定会建立会话)
传输层:可靠传输、不可靠传输、流量控制
网络层:负责选择最佳路径、规划IP地址
数据链路层:帧的开始和结尾、透明传输、查错校验
物理层:接口标准、电器标准