博客整理day26
python day26
软件开发架构
开发软件,要有一套客户端和一套服务端
服务端:24小时不间断提供服务
客户端:需要访问时,向服务端发起访问
软件开发架构:
C/S架构
Client:客户端
Server:服务端
优点:
软件的使用稳定.并且可以节省网络资源
缺点:
1.若用户想在同一个设备上使用多个软件,必须下载多个客户端
2.软件的每一次更新,客户端也必须跟着更新
B/S架构
Browser: 浏览器(客户端)
Server: 服务端
优点:
以浏览器充当客户端,无需用户下载多个软件,也无需用户下载更新
直接在浏览器上访问软件
缺点:
消耗网络资源过大,当网络不稳定时,软件的使用也会不稳定
互联网协议
互联网协议又称为网络七层协议,OSI七层协议
OSI七层协议:
应用层
表示层
会话层
传输层
传输层:帮助区分子网,以太网的Mac帮我们找到主机
传输层的功能:建立端口到端口的通信
端口号:标识电脑上的某一个软件
端口号范围: 0-65535
开发中常用软件的默认端口号:
mysql : 3306
mongodb : 27017
Django : 8000
Tomcat : 8080
Flack : 5000
Redis : 6379
若想服务端与客户端进行通信,必须要建立连接,产生双向通道
一条是客户端通往服务端发送消息的
另一条是服务端通往客户端发送消息的
TCP工作原理
三次握手
第一次握手:建立连接时,客户端发送syn包(syn=x)到服务器,并进入SYN_SENT状态,等待服务器确认
第二次握手:服务器收到syn包,必须确认客户端的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),此时服务器进入SYN_RECV状态
第三次握手:客户端收到服务器的SYN+ACK包,并向服务器发送ACK确认包,此包发送完毕,客户端和服务器都进入 ESTABLISHED 状态(TCP连接成功)
四次挥手
- 客户端进程发送连接释放报文,并且停止发送数据.释放数据报文首部,FIN=1,此时客户端进入FIN-WAIT-1状态
- 服务器收到连接释放报文,发送确认报文,ACK=1,ack=u+1,并且带上自己的序列号,此时服务端进入CLOSE-WAIT(关闭等待)状态.客户端收到服务器的确认请求之后,此时,客户端就进入FIN-WAIT-2状态,等待服务器发送连接释放报文(在这之前还需要接收服务器发送的最后数据)
- 服务器将所有的数据发送完毕之后,就像客户端发送连接释放报文,FIN=1,ack=u+1.此时服务器进入LAST-ACK(最后确认)状态,等待客户确认
- 客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,此时客户端就进入了TIME-WAIT(时间等待)状态.(此时TCP连接还没有释放,需经过2MSL的时间后,才进入CLOSED状态).服务器只要收到了客户端发出的确认请求,就立刻进入CLOSED状态
网络层
IP协议:规定网络地址的协议叫IP协议
IP地址,用于表示唯一的一台进算计(局域网)的地址
IP地址分为:网络部分(标识子网),主机部分(标识主机)
IP:点分十进制
最小值 0,0,0,04
最大值 255,255,255,255
ARP协议功能:广播的方式发送数据包,获取目标主机的Mac地址
协议工作方式:每台主机IP都是已知的
数据链路/层
数据链路层的功能: 定义了电信号的分组(识别电信号)
以太网协议
-
规定好电信号数据的分组方式
-
每一台连接网线的电脑都必须要由一块'网卡'
每块网卡都会有一个独一无二的12位编号(mac地址)
前六位:厂商号
后六位:流水号
交换机:
可以让多台电脑连接到一起
基于以太网协议发送数据:
特点:
广播,单播
弊端:
广播风暴,不能跨局域网通信
互联网:
让局域网之间进行通信
物理连接层
物理层功能:主要是基于电器特性发送高低电压(二进制数据)
Socket
什么是Socket
socket是一个模块,可以用于编写C/S架构的套接字
为什么要是用Socket
socket套接字会封装好各层协议的工作
优点:
可以节省开发成本
Socket的使用
基于TCP开发一款远程CMD程序
客户端连接服务器后,可以向服务器发送命令
服务器收到命令后执行,无论执行是否成功,无论执行几遍,都将执行结果返回给客户端
#客户端
import socket
client = socket.socket()
client.connect(('192.168.13.161',8888))
while True:
cmd_msg = input('请输入CMD命令:')
client.send(cmd_msg.encode('utf-8'))
if cmd_msg == 'q':
break
data = client.recv(1024).decode('utf-8')
print(data)
client.close()
#服务端
import socket
import subprocess
server = socket.socket()
server.bind(('192.168.13.161',8888))
server.listen(3)
conn,addr = server.accept()
while True:
data = conn.recv(1024).decode('utf8')
if data == 'q':
break
retcode, output = subprocess.getstatusoutput(data)
print(retcode, output)
output = output.encode('utf8')
conn.send(output)
conn.close()