zoukankan      html  css  js  c++  java
  • socketserver 之 recv(1024) 问题!



    一、socket发送数据基本流程
    • 图示
      • 流程解释
        • 上述流程,为基本的收发数据流程,并且使用ack来解决粘包问题
        • 并且,最后通过获取server发送的“get file success”来给予用户友好展示

    二、实际应用问题:
    • 问题表现:
      • client已经接收了完成了所有文件数据,但且还处于阻塞状态,即:收不到"get file success"
    • 问题排查:
      • 查看 client 端收到的文件,发现 "get file success" 这个消息,被追加在了文件末尾!
      • 查看 client 端主要代码:
    with open(file, 'wb') as f1:
    recv_size = 0
    while recv_size < file_size:
    data = self.sk.recv(1024)
    recv_size += len(data)
    f1.write(data)

    print(self.sk.recv(1024).decode())  # 打印友好信息
    print('send_file:{} md5_sum:{}'.format(file_size, file_sum), 'recv_file:{} md5_sum:{}'.format(recv_size, md5_sum), sep=' ')  # 打印文件md5值
    • 原因总结:
      • 因为client是通过 sk.recv(1024)来进行接受数据,而1024表示,最多每次接受1024字节,
      • 当文件本身所有数据小于1024时候,那么,最后的"get file success"友好信息也会被client一次性接受,表现在data = self.sk.recv(1024)
      • 即此时:
        • data包涵了文件本身的所有数据+"友好信息"数据,
        • 而当代码走到print(self.sk.recv(1024).decode())时,便会阻塞(实际上server已经将友好信息发送,只不过因为1024的原因,当做了文件本身数据)
    • 解决方式:
      • 1、更改1024为更小单位,比如recv(10)
        • 接收次数变得更多,且若只要是文件,则一定有余数(文件大小 / 10),比如到最后剩余3字节没有接受完,而 3< 10,所以这3字节还是会和“友好信息”混在一起
      • 2、不发送友好信息
        • 在client端直接判断 recv_data_size 和 send_data_size,并计算文件哈希值,来判断文件是否完整,
        • 本就该如此做,即删掉两端关于“友好信息”的交互代码












  • 相关阅读:
    路由器竟装有隐藏摄像头!游客青岛民宿上演教科书式反偷拍
    21天单词速记训练营 第1天~ 21天 加油! (雅途右脑单词速记)
    词汇速记训练营
    词汇速记训练营
    词汇速记训练营
    Windows下解决github push failed (remote: Permission to userA/XXXX.git denied to userB.) 上传gitHub失败报错
    WMITools修复wmi劫持--hao643.com/jtsh123劫持(修改快捷方式跳转至hao123.com)
    Ubuntu下载gitea
    go+cookie+angular踩过的坑
    golang中创建logger时候踩过的坑
  • 原文地址:https://www.cnblogs.com/qiaogy/p/5845409.html
Copyright © 2011-2022 走看看