day 26

开发架构

C/S架构

  • client 和 server, 既客户端和服务端
  • 优点: 稳定性强, 节省网络资源
  • 缺点: 使用多个软件需要下载多个客户端, 软件更新, 客户端也必须下载更新

B/S架构

  • browser 和 server, 既浏览器端和服务端
  • 优点: 以浏览器作为客户端, 直接在浏览器上访问软件. 无需下载多个客户端, 也无需下载更新软件
  • 缺点: 稳定性差, 消耗网络资源过大

OSI模型

  • open system interconnection 开放系统互联
  • 该模型定义了不同计算机互联的标准,是设计和描述计算机网络通信的基本框架

应用层

  • 提供用户服务, 具体的内容由特定的程序规定

表示层

  • 提供数据的加密和解密, 压缩和解压服务

会话层

  • 确定建立应用链接, 选择传输服务

传输层

  • 提供数据传输服务, 进行流量控制
  • TCP/UDP协议, 他们都是基于端口工作的
  • 端口号: 标识计算机上的某个软件
  • 端口号范围: 0-65535
  • 注意: 操作系统中, 一般0-1024的端口号都默认已经被使用了, 尽量使用8000以后的端口号
  • 开发中常用软件的默认端口号:
软件名 端口号
Mysql 3306
mongodb 27017
Django 8000
Tomcat 8080
Flask 5000
Redis 6379
  • 服务端与客户端进行通信, 必须要建立连接, 产生双向通道

网络层

  • 路由选择, 网络互联
  • IP地址: 为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异
  • 点分十进制, 最小0.0.0.0, 最大255.255.255.255
  • 本机IP: 回环地址 127.0.0.1 (localhost)

数据链路层

  • 提供链路交换,具体消息的发送
  • 以太网协议, 用于处理基于电信号发送的二进制数据
  • 以太网协议:
    1. 规定好电信号数据的分组方式
    2. mac地址, 在网络中唯一标识的网卡编号(12位)
  • 交换机: 让多台电脑连接在一起
  • 基于以太网协议发送数据:
    1. 特点: 广播, 单播
    2. 弊端: 广播风暴, 不能夸局域网通
  • 互联网: 让局域网之间进行通信

物理层

  1. 物理硬件, 网卡, 接口等的规定
  2. 基于电信号发送二进制数据

TCP协议

  • transmission control protocol, 传输控制协议

  • TCP是一个流式协议

  • 三次握手, 四次挥手:

    1. 三次握手建立连接

    2. 发送数据:

      客户端让服务端发送数据, 数据存放在内存中, 需要服务端确认收到后, 数据才会在内存中释放掉, 否则会隔一段时间发送一次, 让服务端返回确认收到

      一段时间内, 若服务端还是不返回, 则取消发送, 并释放内存中的数据

    3. 四次挥手终止连接

socket

  • socket是一个模块, 可以写一套C/S架构的套接字
  • socket套接字会封装好各层协议的工作, 节省开发成本
Copy# 服务端
import socket

server = socket.socket()

# 设置IP和端口
server.bind(
    ('127.0.0.1', 8888)
)

# 半连接池, 最大等待数为5
server.listen(5)

while True:
    # 等待连接
    conn, addr = server.accept()  # conn: 建立连接产生的新的套接字, addr: 客户端端口
    print(addr)

    while True:
        try:
            # 接收数据
            data = conn.recv(1024).decode('utf-8')  # 接收最大1024字节的数据

            if data == 'q':
                break

            if len(data) == 0:
                continue

            print(data)

            # 发送数据
            conn.send(data.encode('utf-8'))

        except Exception as e:
            print(e)
            break

    conn.close()
Copy# 客户端
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

    # 接收数据
    date = client.recv(1024).decode('utf-8')
    print(date)

# 关闭连接
client.close()
相关文章
相关标签/搜索