• day26 网络编程


    软件开发架构

    ​ 开发软件,必须要开发一套 客户端 与 服务端

    ​ 客户端与服务端的作用

    ​ 服务端:24小时不间断提供服务

    ​ 客户端:如果想要找服务,就去服务端

    软件开发架构分两种

    C/S架构:

    ​ Client:客户端

    ​ Server:服务端

    优点:

    ​ 软件的使用稳定,并且可以节省网络资源。

    缺点:

    ​ 1.若用户想要在同一个设备上使用多个软件,必须下载多个客户端。

    ​ 2.软件的每次更新,客户端也必须跟着重新下载更新

    c/s架构的软件:

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

    B/S架构:

    ​ Browser:浏览器

    ​ Server:服务端

    优点:

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

    缺点:

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

    b/s架构的软件:
    例如:在浏览器上输入某个软件的域名(http://oldboyedu.com/)

    网络编程

    网络发展历史

    ​ 所有先进的技术都源自于军事,希望通过远程获取数据,所以出现了‘网络编程’。

    ​ 早期如何实现远程通信:

    ​ 打电话—》电话线

    ​ 电脑—》网线,有线网卡

    ​ 笔记本电脑—》有线网卡,无线网卡

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

    ​ 1.物理连接介质—》网卡

    ​ 2.互联网协议:

    ​ 人与人之间沟通的介质:中文,英语

    ​ 计算机之间沟通的介质:“互联网协议”

    互联网协议

    ​ 互联网协议又称网络七层协议,osi七层协议

    OSI七层协议:

    -应用层

    -表示层

    -会话层

    -传输层

    -网络层

    -数据链路层

    -物理连接层

    物理连接层

    ​ 基于电信号发送出二进制的数据0101010101

    数据链路层

    ​ 数据链路层的 “以太网协议”,专门用于处理基于电信号发送出的二进制的数据

    ​ 以太网协议

    ​ 1.规定好电信号数据的分组方式。

    ​ 2.每台连接网线的电脑都必须要有一块“网卡”

    ​ 网卡有不同的厂商生产的

    ​ 每块网卡都会有世界上独一无二12位的编号’“mac”地址。前六位:厂商号 后六位:流水号

    ​ 交换机:

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

    ​ 基于以太网协议发送数据:

    ​ 特点:

    ​ 广播,单播

    ​ 缺点:

    ​ 广播风暴,不能跨局域网通信。

    ​ 互联网:
    ​ 让局域网之间进行通信

    网络层

    IP地址:用于标识唯一的一台计算机(局域网)的地址

    IP:点分十进制

    ​ 最小值:0.0.0.0

    ​ 最大值:255.255.255.255

    IPV4(了解):

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

    IPV6(了解):

    ​ 包括IPV4

    本机IP:回环地址 127.0.0.1——》localhost

    传输层

    TCP/UDP协议,基于端口工作的。

    -端口号:标识电脑上的某一个软件

    -端口号范围:0-65535

    注意:

    ​ 1.操作系统中,一般0-1024的端口都被默认使用了(0-1021不要动)

    ​ 2.尽量使用8000以后的端口号 8001

    开发中常用软件的默认端口号:

    ​ mysql:3306

    ​ mongodb:27017

    ​ Django:8000

    ​ Tomcat:8080

    ​ Flask:5000

    ​ Redis:6379

    若想服务端与客户端进行通信,必须要建立连接,产生双向通道。

    一条是客户端往服务端发送信息的。

    另一条是服务端往客户端发送信息的

    应用层

    http

    ftp

    总结

    ip :用于唯一标识某台计算机的位置。

    port:端口用于确认计算机上的一个应用软件。

    ip+port:世界上某台电脑上的一个应用软件

    TCP协议的工作原理:

    -TCP是一个流式协议

    -三次握手,四次挥手

    ​ -三次握手键连接:

    ​ 建立双向通道,建立好连接

    ​ -listen:监听

    ​ -established:确认请求连接

    ​ -发送数据:
    ​ write

    ​ read

    ​ 客户端往服务端发送数据,数据存放在内存中,需要服务端确认收到,数据才会在内存中释放调,否则,会而一段时间发送一次,让服务端返回确认收到。在一段时间内,若服务端还是不反悔确认收到,则取消发送,并释放内存中的数据。

    -四次挥手断连接

    ​ -TIME_WAIT:时间等待

    Socket:

    1.什么是Socket

    ​ socket是一个模块,可以写一套c/s架构的套接字

    2.为甚要使用Socket

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

    ​ 好处:

    ​ 可以节省开发成本。

    3.如何使用

    ​ import scoket

    注意:客户端与服务端必须遵循:

    ​ 一端send 另一端recv

    ​ 不能两端同时seng或recv

    初始socket套接字

    # 服务端*********************************
    import socket
    
    server=socket.socket()
    
    #绑定(主机,端口号)到套接字
    server.bind(('127.0.0.1',9527))
    
    #开始TCP监听
    server.listen(5)#listen(5)半连接池 设置等待程序个数
    
    #被动接受TCP客户的连接,(阻塞式)等待连接的到来
    # conn: 相当于服务端往客户端挖的管道
    conn,addr=server.accept()
    print(addr)
    
    data=conn.recv(1024).decode('utf-8')
    print(data)
    
    conn.send('我不好'.encode('utf-8'))
    
    conn.close()
    
    server.close()
    
    # 客户端*************************************
    import socket
    
    client=socket.socket()
    
    #主动初始化TCP服务器连接
    # client: 相当于客户端往服务端挖的管道
    client.connect(('127.0.0.1',9527))
    
    client.send('你好'.encode('utf-8'))
    
    data=client.recv(1024).decode('utf-8')
    print(data)
    
    
    # 关闭连接
    client.close()
    

    循环通信套接字

    # 服务端
    import socket
    
    server=socket.socket()
    
    #绑定(主机,端口号)到套接字
    server.bind(('127.0.0.1',9527))
    
    #开始TCP监听
    server.listen(5)#listen(5)半连接池 设置等待程序个数
    
    #被动接受TCP客户的连接,(阻塞式)等待连接的到来
    conn,addr=server.accept()
    print(addr)
    while True:
        data=conn.recv(1024).decode('utf-8')
        print(data)
    
        if data=='q':
            break
    
        send_msg=input('server--->client').encode('utf-8')
        conn.send(send_msg)
    
    conn.close()
    
    server.close()
    
    # 客户端
    import socket
    
    client=socket.socket()
    
    #主动初始化TCP服务器连接
    client.connect(('127.0.0.1',9527))
    while True:
        send_msg=input('client--->srevre:').encode('utf-8')
        client.send(send_msg)
        if send_msg=='q':
            break
    
        data=client.recv(1024).decode('utf-8')
        print(data)
    
    client.close()
    

    服务端多个客户端

    # 服务端
    import socket
    
    server=socket.socket()
    
    #绑定(主机,端口号)到套接字
    server.bind(('127.0.0.1',9527))
    
    #开始TCP监听
    server.listen(5)#listen(5)半连接池 设置等待程序个数
    while True:
        #被动接受TCP客户的连接,(阻塞式)等待连接的到来
        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()
    
    server.close()
    
    # 客户端
    import socket
    
    client=socket.socket()
    
    #主动初始化TCP服务器连接
    client.connect(('127.0.0.1',9527))
    while True:
        send_msg=input('client--->srever:').encode('utf-8')
    
        client.send(send_msg)
        if send_msg=='q':
            break
    
        data = client.recv(1024).decode('utf-8')
        print(data)
    
    client.close()
    
  • 相关阅读:
    我理解的优秀软件工程师
    Hello 博客园!
    线程安全与可重入函数之间的区别与联系
    linux-粘滞位的使用
    死锁产生的四个必要条件及处理死锁的策略
    数据结构—位图
    Linux下进度条的简单实现
    Linux-find命令
    Linux文件3个时间点(access time,modify time,change time)
    各种排序算法的实现、总结
  • 原文地址:https://www.cnblogs.com/zqfzqf/p/11695223.html
Copyright © 2020-2023  润新知