软件开发架构
软件开发架构,必须要开发一套客户端与服务端
客户端与服务端的作用
服务端: 24小时不间断提供服务
客户端: 如果想要找服务,就去寻找服务并享受
软件开发架构分为两种:
C/S架构:
Client: 客户端
Server: 服务端
优点: 软件的使用稳定,并且可以节省网络资源
缺点: 1. 若用户想在同一个设备上使用多个软件,必须下载多个客户端
2. 软件的每一次更新,客户端也必须更新下载
C/S架构的软件:
例如: 电脑上的QQ,Pycharm等...手机端(移动端)微信,王者
B/S架构:
Browser: 浏览器(客户端)
Server: 服务端
优点: 以浏览器充当客户端,无需用户下载多个软件,也无需用户下载更新软件版本,直接在浏览器上访问使用的软件
缺点: 消耗网络资源过大,当网络不稳定时,软件的使用也会不稳定
B/S架构的软件:
例如: 在浏览器(客户端)输入某个软件的域名(http://xxxxxx.com/)
网络编程
-- 网络编程发展历史
所有先进的计数都源自于军事,希望通过远程获取数据,所以出现了"网络编程"
早期如何实现远程通信: -- 打电话---> 电话线
-- 纯平电脑 --> 网线,有线网卡
-- 笔记本电脑 --> 无线网卡
要实现远程通信必须具备:
1.物理链接介质 ---> 网卡....
2.互联网协议
-- 人与人之沟通的介质: 中文,英语
-- 计算机之间沟通的介质: "互联网协议"
互联网协议
互联网协议又称为网络七层协议,OSI七层协议,OSI是一个世界标准组织
OSI七层协议:
- 应用层
- 表示层
- 会话层
- 传输层
- 网络层
- 数据链路层
- 物理连接层
学习由下到上:
需要优先了解的协议一共五层
- 物理连接层
基于电信号发送二进制的数据0101010111
010: 你 you
101: 我 I
- 数据链路层
数据链路层的"以太网协议",专门用户处理基于电信号发送二进制的数据
以太网协议:
1. 规定好电信号的分组方式
2. 每一台连接网线的电脑都必须要由一块"网卡"
- 网卡由不同厂商生产的
- 每块网卡都会有世界上独一无二12位编号
- 前6位: 厂商号
- 后6位: 流水号
- 交换机: 可以将多台电脑连接到一起
基于以太网协议发送数据:
特点: 广播,单薄-
弊端: 广播风暴,不能跨局域网通信
- 互联网: 让局域网之间进行通信
网络层
IP地址: 用于唯一标识计算机(局域网)的地址.
IP: 点分十进制
最小值: 0.0.0.0
最大值: 255.255.255.255
IPV4(了解): 一开始用电脑的人不多,所以出现了IPV4的协议版本
IPV6(了解):
本机IP: 回环地址,127.0.0.1 --> localhost
传输层
TCP/UDP协议,他们是基于端口工作的
- 端口号: 标识电脑某一个软件
- 端口号范围: 0-65535
注意: 1.操作系统中,一般0-1024的端口都被默认使用了(不要动)
2.尽量使用8000之后的端口号 8001
开发中常用软件的默认端口号:
mysql: 3306
mongdb: 27017
Django: 8000
Tomcat: 8080
Flask: 5000
Redis: 6379
若想服务端与客户端进行通信,必须要建立链接,产生双向通道
一条是客户端往服务端发送消息的
另一条是服务端往客户端发送消息的
应用层
http
ftp
总结: IP:用于唯一标识某一台计算机的位置
port: 端口用于确认计算机上的一个应用软件
ip + port: 世界上某一台电脑上的一个应用软件
TCP协议的工作原理
- 三次握手,四次挥手
- 三次握手建连接:
建立双向通道,建立好链接
listen: 监听
established: 确认请求建立连接
- 发送数据
write
read
客户端往服务端发送数据,数据存在内存中,需要服务器确认收到,数据才会在内存中释放掉
否则,会隔一段时间发送一次,让服务端返回确认收到
在一段时间内,若如无段还是不返回确认收到,则取消发送,并释放内存中的数据
- 四次挥手短链接:
TIME_WITE: 时间等待
![](https://images.cnblogs.com/cnblogs_com/LZF-190903/1541387/o_TCP四次挥手 .jpg)
Scoket
socket是一个模块,可以写一套C/S构架的套接字.
socket 套接字会封装好各层协议的工作
好处: 可以节省开发成本
用法: import socket
# 服务端
import socket
server = socket.socket()
server.bind(
('127.0.0.1', 9527)
)
server.listen(1)
while True:
conn, addr = server.accept()
while True:
print(addr)
try:
data = conn.recv(10).decode('utf8')
print(data)
if data == 'q':
break
conn.send(data.encode(('utf8')))
except Exception as e:
print(e)
break
conn.close()
# 客户端
import socket
client = socket.socket()
client.connect(
('127.0.0.1', 8888)
)
while True:
send_msg = input('client---》server:')
client.send(send_msg.encode('utf-8'))
if send_msg == 'q':
break
data = client.recv(1024).decode('utf-8')
print(data)
client.close()
注意: 客户端与服务端必须遵循:
一端send,另一端recv
不同两端同时send或recv