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)