• 网络编程知识点小结


    网络编程知识点回顾

    一、协议

    1.c/s和b/s架构

    c/s:客户端和服务器

    b/s:浏览器和服务器,本质上还是客户端和服务器

    2.osi五层

    • 物理层:高低压电信号
    • 数据链路层:数据报、mac地址
    • 网络层:IP协议和端口号(IP可以通过arp协议,和mac地址进行转换)
    • 传输层:TCP和UDP协议

    TCP:基于数据流的可靠协议(三次握手、四次挥手)

    UDP:基于数据报的不可靠协议

    • 应用层:http协议,邮件协议等

    二、 socket

    在传输层和应用层之间的一层抽象层,可以操作网络层和传输层

    1.用套接字实现tcp协议的通信

    2.用套接字实现的UDP协议的通信

    3.发生粘包的两种情况

    • 发送端需要等缓冲区满才发送出去,造成粘包(发送时间间隔很短,数据又很小,会合到一起,产生粘包)
    • 接收端不及时接收缓冲区的包,造成多个包接收(客户端发送了一段数据,服务端只收了一小部分,服务端下次手的时候还是从缓冲区呐上次一流的数据,产生粘包)

    4.解决粘包的问题

    • 为字节流加上固定的报头,报头中含有字节流的长度,一次send到对端,对端在接收时,先从缓存中取出定长的报头,然后再取真实数据。

      struct()模块,将数据长度打包为四个int型的字节

    • 把报头做成字典,字典里面包含将要发送的真实数据的信息,,然后json序列化,然后用struck将序列化后的数据长度打包成4个字节,一同send到对端

      发送时:
      先发报头长度
      再编码报头内容然后发送
      最后发真实内容
      
      
      接收时:
      先手报头长度,用struct取出来
      根据取出的长度收取报头内容,然后解码,反序列化
      从反序列化的结果中取出待取数据的详细信息,然后去取真实的数据内容
      
      

    5.UDP协议

    • 用udp实现简单通信

      #服务器
      import socket
      soc= socket.socket(socket.AF_INET,socket.SOCK_DGRAM)  #socket.SOCK_DGRAM是UDP协议
      soc.bind(('127.0.0.1',8080))   #绑定地址和端口号
      while True:  #通信循环
          data,addr = soc.recvfrom(1024)  #无需等待接收和监听
          print(data)
          soc.sendto(data.upper(),addr)  #将处理好的数据发送给客户端
      
      #客户端
      import socket
      soc = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)  #实例化一个对象
      while True: #通信循环
          msg= input('请输入数据>>>').strip()
          msg = msg.encode('utf8')  #将数据转化为bytes格式
          soc.sendto(msg,('127.0.0.1',8080))
          data = soc.recvfrom(1024)   #接收数据
          print(data[0]) #打印数
      
    • udp的特点:

      可以发送空内容

      不需要建立连接

      客户端和服务端谁断开都不影响发送

      不会粘包

    6.socketserver模块

    1) socketserver模块实现TCP简单通信

    服务端

    * 导入模块
    * 定义一个类
    * 类中必须重新handle方法
    * handle里面写一些简单的逻辑
    * `if __name__ == '__main__':`
    * 实例化一个socketserver对象:`soc= socketserver.ThreadingTCPServer(('127.0.0.1',8080),MyTcp)`
    * `soc.serve_forever() `
    

    客户端:用socket模块就行

    2)socketserver模块实现UDP简单通信

    书写步骤同上

  • 相关阅读:
    C++ 项目和资源导引
    C++ 类再探
    C++ 语句函数再探
    leetcode-174. Dungeon Game 地下城游戏
    34. Find First and Last Position of Element in Sorted Array + 二分
    leetcode-27. Remove Element删除元素
    git 使用入门
    MySQL数据库的启动与停止
    C++类型转换
    C++ 获取对象类型
  • 原文地址:https://www.cnblogs.com/zhuangyl23/p/11508439.html
Copyright © 2020-2023  润新知