zoukankan      html  css  js  c++  java
  • 网络通讯协议

    网络通讯的基本要素

      物理介质

      通讯协议

        物理层规定物理介质的相关规范 比如网线接口是什么样的 有几根线

          问题:无法理解单纯的二进制数据

        数据链路层

          工作在这一层的是以太网

          规定一组电信号有多少位

          每一组电信号包含什么样的内容

          每一台电脑必须拥有一个全球唯一的mac地址(可以有多个) 

          通过广播的方式来找到对方的mac地址

          问题:不可能 全球广播 会造成广播风暴(广播太多 网络瘫痪)

        网络层

          工作在这一层的是ip地址

          网络地址协议

          给每一给计算机分配一个ip地址

          通常是ipv4

          0.0.0.0-255.255.255.255

          前三段为网络号

          后一段为主机号

          子网掩码来判断是否处于同一个局域网

          arp协议把ip转成mac地址的协议

          ip协议主要的目的就是 找到全球范围内的某一个局域网存在某一台具体的计算机

          问题:一个数据包到达对方计算机后到底交给哪个应用程序来处理

        传输层

          TCP UDP

          用于规范数据传输方式,以及识别应用程序(端口号)

          TCP:可靠,效率低 因为其需要不断的发送确认信息

            适用于:对数据完整性高的程序 比如支付数据 文字信息

          UDP:不可靠传输,效率高于TCP 完全不关心 对方是否收到数据发送到网络中就完事

            适用于:视频聊天 语音 即时对战游戏

            相当于对讲机 bp机

        应用层

          主要用于规定双方应用程序之间以什么形式来传输数据

          这一层的数据形式是有程序员自己制定的常见有HTTP FTP EMAIL等等

      socket

        封装了传输层一堆协议的模块

        什么时候使用

          当你需要开发一款 C/S架构的应用程序的时候 就需要它

          基于C/S架构的应用程序 需要分别开发服务器和客户端程序

          学习的重点就是 如何使用socket编写服务器程序以及如何使用socket编写客户端程序

          通常应该先开发服务器  

    import socket
    
    '''
    1.买一个手机
    2.买一个手机卡
    3.开机待机
    4.接通电话
    5.唠嗑
    6.挂电话
    7.关机
    '''
    # 1.买一个手机
    # 默认情况下创建的是基于强罗的TCP协议的socket对象
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 参数1:协议家族 网络的为AF_INET
    # 参数2:type 用于设置采用的传输协议 TCP的为SOCK_STREAM  UDP的为SOCK_DGRAM
    # 其余参数默认即可
    # 端口号取值 0-65535 0-1023 是系统保留的
    # 重用端口号当你已经关闭了服务器 但是还是报异常说 端口占用 时 可以使用
    s.setsockopt()
    s.bind(('192.168.14.56', 8006))#也是一个阻塞的函数会一直等到
    s.listen()  # 监听客户端的连接
    # c_client 当接收到请求时会返回一个表示客户端的socket对象
    # 客户端的socket对象就负责 这个客户端的数据收发
    # c_address同时返回对方的ip和端口 打包成元组
    c_client, c_address = s.accept()  # 接收客户端的连接请求 该函数会阻塞 直到有连接
    # 开始收发数据
    # recv接收数据
    # buffersize缓冲区大小
    data = c_client.recv(1024)
    print(data)
    # 断开与这个客户端的连接
    c_client.close()
    # 关闭服务器 socket 后续的客户端就无法子啊连接到服务器了
    # 一般正常服务器时不关的
    s.close()  # 关机
    基于TCP的soket服务器
    '''
    服务器程序的大致流程
    1.创建socket独享
    2.绑定ip和port
    3.监听连接
    4.接受请求
    5.接收数据
    6.断开连接
    '''
    import socket
    # 创建socket对象
    c = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 与服务器创立连接 传入服务器的ip和端口
    c.connect(('127.0.0.1', 8006))
    # 收发数据 只能发送bytes类型的数据(任何数据都能发)
    c.send('hello'.encode('utf-8'))
    # 断开与服务器来连接
    c.close()
    基于TCP的soket客户端
    import socket
    
    s = socket.socket()
    s.bind(('127.0.0.1', 8888))
    s.listen()
    while True:
        c, address = s.accept()
        print('收到请求')
        while True:
            try:
                data = c.recv(1024)
                if not data:
                    print('客户端下线了!')
                    break
                print('收到一个数据', data.decode('utf-8'))
                data += b'dsb'
                c.send(data)
            except ConnectionResetError:
                print('对方异常断开连接!')
                break
    改良版服务器
    import socket
    
    s = socket.socket()
    s.connect(('127.0.01', 8888))
    while True:
        res = input('>>>(退出):').strip()
        if res == 'q':
            break
        if not res:
            continue
        s.send(res.encode('utf-8'))
        data = s.recv(1024)
        print(data)
    改良版客户端
  • 相关阅读:
    《梦断代码》读书笔记(二)
    周总结(十三)
    周总结(十)
    知识圈APP开发记录(十六)
    《梦断代码》读书笔记(一)
    知识圈APP开发记录(十五)
    朴素贝叶斯
    单源最短路径 djkstra
    有向图 拓扑排序 文件依赖下的编译顺序该如何确定?
    《人类简史》读后感
  • 原文地址:https://www.cnblogs.com/ShenJunHui6/p/10452701.html
Copyright © 2011-2022 走看看