zoukankan      html  css  js  c++  java
  • 网络编程基础

    1.软件开发架构:
    开发软件,必须要开发一套 客户端 与 服务端。

    客户端与服务端的作用
    服务端: 24小时不间断提供服务
    客户端: 如果想要找服务,就去寻找服务并享受

    软件开发架构分为两种:
    C/S架构:
    Client: 客户端
    Server: 服务端

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

    缺点:
    1.若用户想在同一个设备上使用多个软件,必须下载多个客户端。
    2.软件的每一次更新,客户端也必须跟着重新下载更新。

    C/S架构的软件:
    例如: 电脑上的QQ、Pycharm等...手机端(移动端)的微信、王者荣耀等...

    B/S架构:
    Browser: 浏览器(客户端)
    Server: 服务端

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

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


    B/S架构的软件:
    例如: 在浏览器(客户端)上输入某个软件的域名(http://oldboyedu.com/)。


    2.后期学习
    网络编程、并发编程、数据库开发 可以开发一套C/S架构的软件(防优酷系统)。
    前端html、css、js,web框架(网络编程、并发编程) 可以开发一套B/S架构的软件(bbs系统)。


    3.网络编程

    - 网络编程发展历史
    所有先进的技术都源自于军事,希望通过远程获取数据,所以出现了"网络编程"。

    早期如何实现远程通信:
    - 打电话 ---> 电话线
    - 纯平电脑(大屁股电脑) ---> 网线,有线网卡
    - 笔记本电脑 ---> 有线网卡、无线网卡

    要实现远程通信必须具备:
    1.物理连接介质 ---> 网卡....

    2.互联网协议
    - 人与人之间沟通的介质: 中文、英语
    - 计算机之间沟通的介质: "互联网协议"


    4.互联网协议
    互联网协议又称为网络七层协议,OSI七层协议,OSI是一个世界标准组织。

    OSI七层协议:
    - 应用层
    - 表示层
    - 会话层
    - 传输层
    - 网络层
    - 数据链路层
    - 物理连接层

    学习由下到上:
    需要优先了解的协议一共5层:

    - 物理连接层
    基于电信号发送二进制的数据0101010111。
    010: 你 you
    101: 我 I

    - 数据链路层
    数据链路层的 "以太网协议",专门用于处理基于电信号发送二进制的数据。

    以太网协议:
    1.规定好电信号数据的分组方式。
    2.每一台连接网线的电脑都必须要由一块 "网卡"。
    - 网卡由不同厂商生产的
    - 每块网卡都会有世界上独一无二12位的编号 "mac"地址。
    - 前6位: 厂商号
    - 后6位: 流水号

    - 交换机:
    可以让多台电脑连接到一起。

    基于以太网协议发送数据:
    特点:
    广播、单播

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

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

    - 网络层
    IP地址: 用于标识唯一的一台计算机(局域网)的地址。
    IP: 点分十进制
    最小值: 0.0.0.0
    最大值: 255.255.255.255

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

    IPV6(了解):
    括号IP。

    本机IP: 回环地址 127.0.0.1 ---> localhost

    - 传输层
    TCP/UDP协议,他们都是基于端口工作的。

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

    - 端口号范围: 0-65535

    注意:
    1.操作系统中,一般0-1024的端口都被默认使用了(0-1024不要动)
    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: 时间等待



    5.Socket:

    1.什么是Socket?
    socket是一个模块,可以写一套C/S架构的套接字。

    2.为什么要使用Socket?
    socket套接字会封装好各层协议的工作。
    好处:
    可以节省开发成本。

    3.如何使用
    import socket


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

    6.初始socket套接字
      1.客户端
    #客户端
    import socket
    
    # 买手机
    client = socket.socket()
    
    # 往服务端拨号
    # client: 相当于客户端往服务端挖的管道
    client.connect(
        # ip + port: 寻找服务端
        ('127.0.0.1', 9527)
    )
    
    # 客户端向服务端说话
    
    client.send('你好 小贱贱'.encode('utf-8'))
    data = client.recv(1024)
    print(data)
    
    # 关闭连接
    client.close()
    
    
    1.客户端
    #服务端
    import socket
    
    # 默认指定TCP协议
    # 买手机
    server = socket.socket()
    # 插卡
    server.bind(
        # ip + port
        ('127.0.0.1', 9527)
    )
    # 开机,等待接听
    server.listen(5)  # listen(5) 半连接池
    
    # 监听是否有消息
    # conn: 相当于服务端往客户端挖的管道
    conn, addr = server.accept()
    print(addr)
    
    # 听客户端给我说话
    data = conn.recv(1024).decode('utf-8')  # 可以接收1024字节数据
    print(data)
    
    conn.send(b'hello xiao tank')
    
    # 挂电话
    conn.close()
    
    # 关机
    server.close()
    7.循环通信套接字

      1.客户端

    import socket
    client = socket.socket()
    client.connect(
        ('127.0.0.1', 9527)
    )
    
    
    while True:
        send_msg = input('client---> server:')
    
        # 服务端往客户端发送的数据
        client.send(send_msg.encode('utf-8'))
    
        if send_msg == 'q':
            break
    
        # 服务端返回的数据
        data = client.recv(1024).decode('utf-8')
        print(data)
    
    
    client.close()
     2.服务端
    import socket
    
    server = socket.socket()
    server.bind(
        ('127.0.0.1', 9527)
    )
    server.listen(5)  # listen(5) 半连接池
    
    conn, addr = server.accept()
    print(addr)
    
    while True:
        # 接收客户端发送过来的消息
        data = conn.recv(1024).decode('utf-8')  # 可以接收1024字节数据
        print(data)
    
        if data == 'q':
            break
    
        # 让服务端数据发送给客户端的消息
        send_msg = input('server--->client: ').encode('utf-8')
        conn.send(send_msg)
    
    
    conn.close()
    
    

    8.服务端多个客户端

      1.客户端

    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
    
        data = client.recv(1024).decode('utf-8')
        print(data)
    
    client.close()

      2.服务端

    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()
    
    
     
  • 相关阅读:
    【splunk】数据输入-文件目录 导入失败
    【linux】tar压缩不包含路径
    【python】已安装模块提示ImportError: No module named
    【splunk】用正则表达式提取字段
    【python】xsspider零碎知识点
    【scrapy】资料
    【splunk】一些查询例子
    【docker】将容器中数据拷贝到主机
    【linux】ubuntu下crontab无效解决方法
    Flink – metrics V1.2
  • 原文地址:https://www.cnblogs.com/fjn839199790/p/11692019.html
Copyright © 2011-2022 走看看