软件开发架构

客户端+服务端

  1. 服务端:24小时提供服务
  2. 客户端:寻找服务

C/S架构

  • Client:客户端

  • server:服务端

  • 优点:软件的使用稳定,可以节省网络资源

  • 缺点:

    1. 若用户想在同一个设备上使用多个软件,必须下载多个客户端
    2. 软件的每一次更新,客户端也必须重新下载更新
  • C/S架构的软件

    例如:电脑上的QQ,pycharm,手机端的微信,王者荣耀等

B/S架构

  • Browser:浏览器(客户端)

  • Server:服务器

  • 优点

    以浏览器充当客户端,无需用户下载多个软件,也无需用户下载更新软件版本,直接在浏览器访问需要使用的软件

  • 缺点

    消耗网络资源过大,当网络不稳定时,软件使用也会不稳定

  • B/S架构的软件

    例如在浏览器上输入某个域名的地址

网络编程、并发编程、数据库开发可以开发C/S架构的软件(仿优酷系统)

前端html、css、js、web框架(网络编程、并发编程)可以开发B/S架构的软件(BBS系统)

网络编程

要实现远程通信必须具备:

  1. 物理连接介质:比如网卡
  2. 互联网协议:计算机沟通的介质,就好比人类交流的语言

互联网协议/OSI七层协议

互联网协议又称为网络七层协议/OSI七层协议,ISO是一个世界组织

  1. 应用层
  2. 表示层
  3. 会话层
  4. 传输层
  5. 网络层
  6. 数据链路层
  7. 物理连接层

传输层

  • TVP//UDP协议,都是基于端口工作的

    • 端口号:标识电脑上某一个应用程序

    • 端口号范围:0-65535

      注意:

      1. 操作系统中,一般0-1024的段都被默认使用了(不要动)
      2. 尽量使用8000之后端口
    • 开发中常用软件的端口号

      • mysql:3306
      • mongodb:27017
      • Django:8000
      • Tomcat:8080
      • Flask:5000
      • Redis:6379
    • 若想服务端和客户端进行通信,必须要建立连接,产生双向通道(两条管道)

      • 一条是客户端往服务端发送消息
      • 一条是客户端往服务端发送消息

    总结

    • ip:用于唯一表示某一台计算机的位置
    • port:端口用于确认计算机上的一个应用程序
    • ip+port:世界上某一台电脑上的一个应用软件

    • TCP协议的工作原理

      • TCP是一个流式协议

      • 三次握手,四次挥手

        1. 三次握手键连接

          • 建立双向通道

            1. Listen:监听
            2. established:确认请求建立连接
          • 发送数据

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

            在一段时间内,如果服务端还是不返回确认收到,则取消发送,并释放内存中的数据

        2. 四次挥手断连接

          TIME_WAIT:时间等待

网络层

  • IP地址:用于表示计算机(IP地址)

  • IP:点分十进制

    最小值:0.0.0.0

    最大值:255.255.255.255

  • IPV4:

    一开始用电脑的人不多,所以出现了IPV4的协议版本

  • IPV6

    后来用的人多了,出现了IPV6,包括IPV4

  • 本机IP

    • 回环地址:127.0.0.1(localhost)

数据链路层

  • 数据链路层的‘以太网协议,专门用于处理基于电信号发送的数据

    • 以太网协议

      1. 规定好电信号数据的分组方式
      2. 每一台连接网线的电脑都必须要由一块“网卡”
        • 网卡是由不同厂商生产的
        • 每块网卡都会有世界上独一无二的12为编号
          1. 前六位:厂商号
          2. 后六位:流水号
    • 交换机

      ​ 可以让多台电脑连接到一起

  • 基于以太网协议发送数据

    特点:广播,单播

    弊端:广播风暴,不能跨局域网通信

  • 互联网

    让局域网之间可以通信

物理连接层

  • 基于电信号发送二进制的数据

socket

什么是socket

socket是一个模块,可以写一套C/S架构的套接字

为什么用socket

socket套接字会封装好各层协议的工作

  1. 好处
  2. 可以节省开发成本

如何使用

单次通信

# 服务端.py
import socket

# 默认指定TCP协议
server = socket.socket()  # 相当于买手机

# 插卡
sever.bind(
('127.0.0.1',9527)
)  # IP+port 元组

# 相当于开机,等待接听
sever.listen(5)  # 半连接池

# 监听是否有消息
# conn相当于服务端往客户端挖的管道
conn,addr = sever.accept()  # 返回的(sock,addr)
print(addr)

# 接受客户端的消息
data = conn.recv(1024)  # 可以接受1024字节数据
# data = conn.recv(1024).decode('utf-8')
print(data)

conn.send(b'hi')

# 相当于挂掉电话
conn.close()

# 相当于关机
sever.close
# 客户端.py
import socket

# 买手机
client = socket.socket()

# 往服务端拨号
# client详单与客户端往服务端挖的管道
client.connect(
('127.0.0.1',9527)
)  # ip+port 寻找服务端

# 客户端向服务端说话
client.send(b'hello')
# client('你好'.encode('utf-8'))

data = client.recv(1024)
# data = client.recv(1024).decode('utf8')
print(date)

# 关闭连接
client.close()

注意:客户端与服务端必须遵循“一端send,另一端recv”不能两端同时send或recv

循环通信

# 服务端.py
import socket

server = socket.socket()  # 相当于买手机
sever.bind(
('127.0.0.1',9527)
)  

sever.listen(5)  # 半连接池

conn,addr = sever.accept()  # 返回的(sock,addr)
print(addr)

while True:
    # 接收客户端发送过来的消息
    data = conn.recv(1024)
    print(data)
    if data = 'q':
        break
    # 让服务端输入发送给客户端的消息
    send_msg = input('服务端-->客户端').encode(utf-8)
    conn.send(send_msg)

conn.close()

sever.close
# 客户端.py
import socket

client = socket.socket()
client.connect(
('127.0.0.1',9527)
)  # ip+port 寻找服务端

while True:
    send_msg= input('客户端--》服务端')
    # 服务端发送给客户端的数据
    client.send(send_msg.encode('utf-8'))
    # 服务端返回的数据
    client.recv(1024).decode('utf-8')
    print(1024)

client.close()

服务端连接多个客户端

# 服务端
import socket
server = socket.socket()
server.bind(
    ('127.0.0.1', 8888)
)
server.listen(5)  # 半连接池,可以“等待5个用户接受服务”

while True:
    # 等待客户端连接过来
    conn, addr = server.accept()
    print(addr)

    # 循环接收客户端数据
    while True:
        try:
            data = conn.recv(1024).decode('utf-8')
            print(data)

            # mac和linux系统bug: b''
            if len(data) == 0:
                continue

            if data == 'q':
                break

            conn.send(data.encode('utf-8'))

        except Exception as e:
            print(e)
            break

    conn.close()

# 客户端
import socket

client = socket.socket()

client.connect(
    ('127.0.0.1', 8888)
)

while True:
    send_msg = input('>>>:')

    client.send(send_msg.encode('utf-8'))

    if send_msg == 'q':
        break

    data = client.recv(1024).decode('utf-8')
    print(data)

client.close()

开发架构+osi七层协议+socket(day26)的更多相关文章

  1. python网络编程-Json序列化功能扩展-软件开发架构-OSI七层协议-TCP-01

    面向对象补充知识点(面向对象的应用) 扩展json序列化所支持的数据类型(分析源码) import json from datetime import datetime, date # ------- ...

  2. 网络编程之网络架构及其演变过程、互联网与互联网的组成、OSI七层协议、socket抽象层

    目录 网络架构及其演变过程 单机架构 CS架构 BS架构 BS架构和CS架构的区别 C/S架构的优缺点: B/S架构的优缺点: 互联网与互联网的组成 互联网的组成(教科书版) 互联网的组成(科普版) ...

  3. 1、网络并发编程--简介、软件开发架构、OSI七层协议

    python复习 变量与常量 基本数据类型 内置方法 字符编码.文件操作 函数 函数参数.闭包函数.装饰器 面向对象 封装.继承.多态 """ 什么是对象 数据与功能的结 ...

  4. 软件开发架构介绍||OSI七层协议之物理层、数据链路层、网络层、传输层(mac地址、ip协议、断开协议、tcp协议之三次握手四次挥手)

    一.网络编程 软件开发架构 C/S架构 C:客户端 想体验服务的时候才会去找服务端体验服务 S:服务端   24小时不间断的提供服务,即时监听,随时待命 B/S架构 B:浏览器    想体验服务的时候 ...

  5. 软件开发架构与网络之OSI七层协议(五层)

    本期内容概要 python回顾 软件开发架构 网络理论前瞻 osi七层协议(五层) 以太网协议 IP协议 port协议 交换机 路由器 局域网 广域网 TCP协议 三次握手 四次挥手 UDP协议 内容 ...

  6. Day09: socket网络编程-OSI七层协议,tcp/udp套接字,tcp粘包问题,socketserver

    今日内容:socket网络编程    1.OSI七层协议    2.基于tcp协议的套接字通信    3.模拟ssh远程执行命令    4.tcp的粘包问题及解决方案    5.基于udp协议的套接字 ...

  7. day28——C/S与B/S架构、网络通信原理、osi七层协议、UDP、TCP协议、TCP的三次握手与四次挥手

    day28 C/S B/S架构 C:client 客户端 B:browse浏览器 S:server 服务端 C/S C/S架构:基于客户端与服务端之间的通信 ​ QQ.游戏.皮皮虾 ​ 优点:个性化设 ...

  8. 8.6 day27 网络编程 osi七层协议 Time模块补充知识 TCP协议

    Time模块补充知识 date和datetime区别是什么? date 就是年月日 datetime就是年月时时分秒 以下代码为什么会报错? import json from datetime imp ...

  9. 网络框架,互联网的组成,OSI七层协议,抽象层

    6.25自我总结 1.网络框架 1.单机 单机游戏 以下两个基于网络的 2.CS架构 cs--->client客户/server服务 服务端(应用程序)一个就够了,客户端(应用程序)可以有多个 ...

随机推荐

  1. SPN扫描

    0x01介绍 Kerberos是一种支持票证身份验证的安全协议.如果客户端计算机身份验证请求包含有效的用户凭据和服务主体名称 (SPN),则 Kerberos 身份验证服务器将授予一个票证以响应该请求 ...

  2. 【面试题】Java常见面试题

    集合与数组? 数组:(可以存储基本数据类型)是用来存储对象的一种容器,但是数组的长度固定,不适合在对象数量未知的情况下使用 集合:(只能存储对象,对象类型可以不一样)集合的长度可变,可在多数情况下使用 ...

  3. HNU_小初高数学学习软件_功能说明

    结对编程项目主要功能: 1.用户注册功能.用户提供手机号码,点击注册将收到一个注册码,用户可使用该注册码完成注册: 2.用户完成注册后,界面提示设置密码,用户输入两次密码匹配后设置密码成功.密码6-1 ...

  4. [经验栈]SQL语句逻辑运算符"AND"、"&&"兼容性

    最近打算把博客转移到typecho平台,选了一个风格个人比较喜欢的主题,即Akina for Typecho 主题模板,在这里先感谢题主的开源分享,但是在使用过程中一开始就出现"500 Da ...

  5. vue中关于滚动条的那点事

    vue中关于滚动条的那点事 不知道你有没有遇到过这种情况,有时当页面切换时,滚动条不在页面的顶端.最近半路加入一个项目,就遇到这种情况.(若只是为了解决此问题,可直接翻到最下方)下面谈谈解决此问题的过 ...

  6. 要不要学习Git(分布式版本控制系统)

    做技术的人,要不要学一学Git呢? 提出这个问题,是因为很多小伙伴还不会使用Git. 对于任何新一代的技术工具,它在业界普及都有一个过程,Git的阻碍是:学习成本.工具迭代的成本. SVN诞生于200 ...

  7. TCP通信 -C/S中的Socket与ServerSocket

    客户端类:Socket类 TCP通信的客户端:向服务器发送连接请求,给服务器发送数据,读取服务器的数据,两次IO流 java.lang.Object 继承者 java.net.Socket 构造方法: ...

  8. Linux 删除命令rm

    Linux rm命令用于删除一个文件或者目录. 语法:rm [options] name... 参数: 1.-i 删除前逐一询问确认. 2.-f 即使原档案属性设为唯读,亦直接删除,无需逐一确认. 3 ...

  9. 强大得分布式项目管理工具Git

    ---恢复内容开始--- 强大的分布式管理工具-Git(一) 前言:最近忙着写项目,在期间呢,用的是git管理,由于一个项目的管理是很重要得,所以整理了一篇关于git得博客跟大家分享一下.大家都知道, ...

  10. Linux下格式化恢复USB启动优盘

    问题描述:优盘制作成启动盘安装操作系统,但是后边使用时发现无法格式化,提示 This partition cannot be modified because it contains a partit ...