• 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()
    
  • 相关阅读:
    HDU 5334 Virtual Participation(2015多校第四场)
    HDU 1754 I Hate It(线段树+单点更新)
    HDU 5308 I Wanna Become A 24-Point Master(2015多校第二场)
    linux下socket调试
    linux驱动之hello_world源码与编译
    那些年优秀的HTML5活动页面
    近期Responsive web design项目经验分享-高分辨率图片处理篇
    近期Responsive web design项目经验分享
    var foo= {} ;foo.method() 和 单例模式有什么区别
    Web程序设计
  • 原文地址:https://www.cnblogs.com/colacheng0930/p/11696227.html
Copyright © 2020-2023  润新知