粘包问题

今日内容:
    - subprocess模块

    - 粘包问题
        服务端第一次发送的数据,客户端无法精确一次性接受完毕。
        下一次发送的数据与上一次数据粘在一起了。

        1.无法预测对方需要接受的数据大小长度。
        2.多次连续发送数据量小、并且时间间隔短的数据一次性打包发送。

        TCP协议特性:
            tcp是一个流式协议,会将多次连续发送数据量小、并且时间间隔短的数据一次性打包发送。

    - 解决粘包问题:
        - struct模块
        必须先定义报头,发送报头,再发送真实数据。

        - 既想发送文件,又想发送文件的描述信息

            # 客户端发送字典给服务端
                send_dic = {
                    file_name: 文件名
                    file_size: 文件的真实长度 1000000
                }

                # 通过json模块序列化成bytes数据
                json_data = json.dumps(send_dic)
                bytes_data = json_data.encode('utf-8')  # bytes

                # 先获取字典的报头
                headers = struct.pack('i', len(bytes_data))

            # 服务端接收到字典,并接收文件的真实数据

    - 上传大文件
        客户端往服务端上传大文件

    - UDP
        UDP是一种传输协议。
            1)不需要建立双向管道。
            2)不会粘包
            3)客户端给服务端发送数据,不需要等待服务端返回接收成功
            3)数据容易丢失,数据不安全。

        - TCP: 就好比在打电话。
        - UDP: 就好比在发短信。


    - QQ聊天室

    - SocketServer
        python内置模块,可以简化socket套接字服务端的代码。
        - 简化TCP与UDP服务端代码
        - 必须要创建一个类



posted @ 2019-10-21 19:50  哥$  阅读(94)  评论(0编辑  收藏  举报