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