基础理论知识

C/S 、B/S架构

架构名称定义优点缺点
C/S基于客户端与用户端之间的架构界面和操作丰富,安全性容易保证,响应速度快需要开发两套程序,开发维护成本高,兼容性差
B/S基于C/S架构的一种特殊的C/S架构,浏览器与服务端之间的架构。分布性强,客户端几乎不需要维护,开发简单,共享性强,维护简单方便个性化低,安全性及响应速度需要花费巨大设计成本

CS响应速度快,安全性强,一般应用于局域网中,但是开发维护成本高;BS可以实现跨平台,客户端零维护,但是个性化能力低,响应速度较慢。所以有些单位日常办公应用BS,在实际生产中使用CS结构。

OSI七层.png

网络通信

单个客户端与服务端通信

服务端代码示例

import socket

# 1. 创建socket对象(买电话)
phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # 参数可以默认不写

# 2. 绑定IP地址和端口  # 安装电话卡
phone.bind(('127.0.0.1',8848))

# 3. 监听(开机)
phone.listen(5)

# 4. 等待电话连接(等别人给你打电话)
print('start...')
conn,client_addr = phone.accept()  # 此时运行就会一直阻塞住。
print('连接来了:',conn,client_addr)

# 5. 接受消息
msg = conn.recv(1024)  # 每次至多读取1024个字节
print('客户端的消息:',msg)
conn.send(msg.upper())

# 6. 关闭连接
conn.close()

# 7. 关机
phone.close()

socket.AF_INET:基于网络的socket套接字。

socket.SOCK_STREAM:基于TCP协议的socket套接字。

phone.listen:这个知识点有一些不容易理解,服务端开启之后,等待客户端连接,listen做了一个客户端数量的限定,listen(n)只有n+1的客户端可以连接上我的服务端,但是连接上之后,只有第一个客户端可以与服务端进行互相通信,其他的n个客户端已经成功建立链接但是需要等待第一个客户端结束之后,逐一进行通信,通信之前的状态都是阻塞状态;n+1以外的客户端虽然也是阻塞,但是是连链接都建立不成的,就是单纯的阻塞。只有第一客户端结束之后,剩余的才可以逐一建立链接等待。这个其实与服务端开启的半链接池相关,什么叫半链接池?服务端开启之后,只要有客户端链接我,理论上来说都可以与我建立链接的,但是只要建立链接,在我服务端就会占有一定的内存,暂存这些链接数据,试想一下,如果1000万个链接进入我的服务端的内存,这样会极大的浪费内存资源,所以服务端设置一个半链接池,只允许n+1个客户端与我服务端建立链接,剩下的客户端也是处于阻塞状态,但是不会进入我的内存,这样可以控制客户端的数量,节省内存。

accept:服务端会处于阻塞状态,直至有客户端链接我,服务端代码才会向下执行。

客户端代码示例

import socket

# 1. 创建socket对象(买电话)
phone = socket.socket()

# 2. 与服务端建立链接
phone.connect(('127.0.0.1',8848))

# 3. 发消息
phone.send('hello'.encode('utf-8'))
from_server_data = phone.recv(1024)
print(from_server_data)

phone.close()