python文件传输之粘包问题

client
#! /usr/bin/env python
# -*- coding:utf-8 -*-
"""
无法将发送文件的大小正确获取出来。我们可以看出
在客户端发送文件大小的同时,文件第一行的数据也被发送过去
导致无法进行正确的装换,因此会失败,为这个问题调试了好久,
但是当我们将获取文件大小进行输出时,才知道错误在什么地方
这个问题用专业的数据解释为文件的粘包(即文件在传输过程中数据粘在一起)
为了解决这个问题,我们可以模拟类似tcp三次握手的过程,等待服务端回复一个ACK,客户端进行接收
"""
import socket
import os

file_size = os.stat("__init__.py").st_size
sock = socket.socket()
sock.connect(("127.0.0.1",8080))

sock.sendall(bytes(str(file_size),encoding="utf-8"))

sock.recv(1024)

with open("__init__.py","rb") as f:
    for line in f:
        sock.sendall(line)

sock.close()


server

#! /usr/bin/env python
# -*- coding:utf-8 -*-

import socket

sock = socket.socket()

sock.bind(("127.0.0.1",8080))
sock.listen(10)

while True:
    conn, address = sock.accept()

#获取文件大小
    file_size = str(conn.recv(1024), encoding="utf-8")
    total = int(file_size)
    print(total)
    conn.sendall(bytes("ACK", encoding = "utf-8"))


    had_recv = 0
    with open("__new__.py", "wb") as f:
        while True:
            if had_recv == total:
                break
            else:
                data = conn.recv(1024)
                f.write(data)
                had_recv += len(data)



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值