一.软件开发架构
1. C / S 架构
C/S即:Client与Server ,中文意思:客户端与服务器端架构,这种架构也是从用户层面(也可以是物理层面)来划分的。
这里的客户端一般泛指客户端应用程序EXE,程序需要先安装后,才能运行在用户的电脑上,对用户的电脑操作系统环境依赖较大。
2. B / S 架构
Browser与Server,中文意思:浏览器端与服务器端架构,这种架构是从用户层面来划分的。
Browser浏览器,其实也是一种Client客户端,只是这个客户端不需要大家去安装什么应用程序,只需在浏览器上通过HTTP请求服务器端相关的资源(网页资源),客户端Browser浏览器就能进行增删改查。
二.网络基础
1.一个程序如何在网络上找到另一个程序?
首先,程序必须要启动,其次,必须有这台机器的地址,我们都知道我们人的地址大概就是国家省市区街道楼门牌号这样字。那么每一台联网的机器在网络上也有自己的地址,它的地址是怎么表示的呢?
就是使用一串数字来表示的,例如:100.4.5.6
IP地址:
IP地址是指互联网协议地址(英语:Internet Protocol Address,又译为网际协议地址),是IP Address的缩写。IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。 IP地址是一个32位的二进制数,通常被分割为4个“8位二进制数”(也就是4个字节)。IP地址通常用“点分十进制”表示成(a.b.c.d)的形式,其中,a,b,c,d都是0~255之间的十进制整数。例:点分十进IP地址(100.4.5.6),实际上是32位二进制数(01100100.00000100.00000101.00000110)。
端口:"端口"是英文port的意译,可以认为是设备与外界通讯交流的出口。
ip地址精确到具体的一台电脑,而端口精确到具体的程序。
2.osi七层模型
人们按照分工不同把互联网协议从逻辑上划分了层级:
3.socket
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
其实站在你的角度上看,socket就是一个模块。我们通过调用模块中已经实现的方法建立两个进程之间的连接和通信。 也有人将socket说成ip+port,因为ip是用来标识互联网中的一台主机的位置,而port是用来标识这台机器上的一个应用程序。 所以我们只要确立了ip和port就能找到一个应用程序,并且使用socket模块来与之通信。
4.TCP/UDP协议
TCP(Transmission Control Protocol)可靠的、面向连接的协议(eg:打电话)、传输效率低全双工通信(发送缓存&接收缓存)、面向字节流。使用TCP的应用:Web浏览器;电子邮件、文件传输程序。
UDP(User Datagram Protocol)不可靠的、无连接的服务,传输效率高(发送前时延小),一对一、一对多、多对一、多对多、面向报文,尽最大努力服务,无拥塞控制。使用UDP的应用:域名系统 (DNS);视频流;IP语音(VoIP)。
5.socket 的使用
1.基于TCP协议使用socket
tcp是基于链接的,必须先启动服务端,然后再启动客户端去链接服务端
server端
import socket sk = socket.socket sk.bind(("127.0.0.1",55555)) #把地址绑定到套接字上 sk.listen() #监听连接 conn,addr = sk.accpet() #接收客户端连接 ret = conn.recv(1024) #接收客户端信息 print(ret) #打印客户端信息 conn.send(b"hi") #向客户端发送信息 conn.close() #关闭客户端套接字 sk.close() #关闭服务器套接字
client端
import socket sk = socket.socket() #创建客户套接字 sk.connect(("127.0.0.1",55555)) #尝试连接服务器 sk.send(b"hello") #发送消息 ret = sk.recv(1024) #接收 print(ret) sk.close() #关闭
2.基于UDP协议的socket
udp是无链接的,启动服务之后可以直接接受消息,不需要提前建立链接
server端
import socket sk = socket.socket(type=socket.SOCK_DGRAM) #创建一个服务器的套接字 sk.bind(("127.0.0.1",55555)) #绑定服务器套接字 msg,addr = sk.recvfrom(1024) print(msg) sk.sendto(b"hi",addr) #对话 sk.close() #关闭服务器套接字
client端
import socket ip_ = ("127.0.0.1",55555) sk = socket.socket(type=socket.SOCK_DGRAM) sk.sento(b"hello",ip_) msg,addr = sk.recvfrom(1024) print(msg.decode("utf-8),addr)