1.软件架构
- c/s架构
- client客户端
- server服务端
- 优点:软件的使用稳定,可以节省网络资源
- 缺点:若用户想在同一个设备上使用多个软件,必须下载多个客户端。软件的每一次更新,客户端也必须跟着更新
- c/s架构的软件
QQ,Pycharm
- b/s架构
- browser:浏览器
- server:服务器
- 优点:以浏览器充当客户端,无需用户下载多个软件,也无需用户下载更新软件版本。用户以浏览器充当客户端,直接在浏览器访问需要使用的软件。
- 缺点:消耗网络资源过大,当网络不稳定的时候,网络的使用也不稳定。
2.网络编程
实现远程通信必须具备:
- 物理连接介质:网卡
- 互联网协议
- 计算机之间沟通的介质:互联网协议
互联网协议:
互联网协议又称为网络七层协议,OSI七层协议,OSI是一个世界标准组织
物理连接层
- 基于电信号发送二级制的数据01001001001010010
数据链路层
数据链路层的以太网协议,专门用于处理基于电信号的二级制数据
以太网协议:
- 规定好电信号的数据分组方式
- 每一台连接网线的电脑必须要有一块网卡
- 网卡由不同的厂商生成的
- 每块网卡都会有世界上独一无二的12位编号
- 前6位:厂商号
- 后6位:流水号
- 每块网卡都会有世界上独一无二的12位编号
- 网卡由不同的厂商生成的
交换机:可以让多台电脑连接到一起。
基于以太网协议发送数据
特点:
广播,单播
弊端:
广播风暴,不能跨局域网通信
互联网
- 让局域网之间可以通信。
网络层
- IP地址:用于唯一标识计算机的地址
- IP:点分十进制
- 最小值:0.0.0.0
- 最大值255.255.255.255
传输层
TCP/UDP协议,他们都是基于端口工作的
端口号:标识电脑上某一个软件。
端口范围:0~65535
- 注意
- 操作系统中0~1024都被默认使用了。
- 尽量使用8000之后的端口号
- 常用软件的默认端口号
- mysql:3306
- mongodb:27017
- Django:8000
- tomcat:8080
- Flask:5000
- Redis:6379
- 若想服务端与客户端进行通信,必须要建立连接,产生两条管道。
- 一条是客户端往服务端发送消息的
- 另一条是服务端往客户端发送消息的
- TCP协议工作原理
- 三次握手,四次握手
- 三次握手建立连接
- 建立双向通道,建立好连接
- listen:监听
- established:确认请求建立连接
- 发送数据:
- wrtie
- read
- 客户端往服务端发送数据,数据存放在内存中,需要服务端确认收到,数据才会在内存中释放。否则会隔一时间发送一次,让服务端返回确认收到。在一段时间内,若服务端不返回确认收到,则取消发送。并释放内存数据
- 建立双向通道,建立好连接
- 四次握手断连接
- TIME_WAIT:时间等待
- 三次握手建立连接
- 三次握手,四次握手
- 注意
应用层
- 应用层协议http,ftp
- 总结:
- IP:用于唯一标识某一台计算机的位置
- port:端口用于确认计算机上的一个应用软件
- IP+PORT:世界上某台电脑的软件
3.socket编程
- 什么是socket:
- socket是一个模块,可以写一套c/s架构的套接字
- 为什么要使用socket
- socket套接字会封装好各层协议的工作
- 好处:可以节省开发成本
- 如何使用socket
#服务端 # -*-coding:utf-8-*- # Author: yqliu # CreatDate: 2019/10/17 14:37 import socket #默认指定TCP协议 #买了手机 server=socket.socket() #插卡 server.bind( #ip+port ('127.0.0.1',9527) ) #开机 server.listen(5)#半连接池 print ('服务端启动。。。。。。。。。。。') #监听是否有消息 #conn相当于服务端往客户端挖的管道 # conn,addr=server.accept() print (addr) #听客户端给我说话 data=conn.recv(1024)#1024可接收1024字节数据 print (data) conn.send(b'hello client') #挂掉电话 conn.close() #关机 server.close() *********************************************** #客户端 # -*-coding:utf-8-*- # Author: yqliu # CreatDate: 2019/10/17 14:37 import socket print ('客户端开始启动。。。。。。') #买手机 client=socket.socket() #往服务器拨号 #client相当于客户端往服务端挖了管道 client.connect( ('127.0.0.1',9527) ) #客户端发送向服务端说话 client.send(b'hello server') data=client.recv(1024) print (data) #向服务端发送断开连接的请求 client.close() #注意点,客户端与服务端必须遵循: #一端send另一端recv,不能同时send或者recv