通过socket进行文件传输,通过二进制文件长度进行判断,遇到大文件就会出现发送与接收长度不一致的问题。 官方有类似说明及演示代码。其与我们平常编程socket区别在于,对于一个常规的socket文件传输,官方示例代码将发送端的read的缓存设置为65535。
经过部分测试,如果不设置或设置为其他大小,就会出现客户端接收文件长度不一致的情况。将read缓存设置65535后,通过二进制数据长度判断数据接收,是可以正常运行的。
client.py(发送数据)个人测试代码: 说明:任意输入后,将发送指定文件
import os,socket # Import socket module
client = socket.socket() # Create a socket object
port = 9999 # Reserve a port for your service.
client.connect(('localhost', port))
while True:
cmd = input('>>>:')
filesize = os.path.getsize('filename')
client.send(bytes(str(filesize).encode('utf-8')))
#发送文件
f = open('filename','rb')
data = f.read(65535) **#缓存设置为65535,客户端接收正常,不设置或设置其他值,均有问题**
print(len(data))
sendsiez = 0
while (data):
client.send(data)
data = f.read(1024)
sendsiez += len(data)
f.close()
print(sendsiez)
print('Done sending')
server.py(接收文件)个人测试代码: 说明:客户端读取缓存设置为65535后,接收文件采用 recesize == filetotalsize 这个方式判断才方便有效
import socket
host = 'localhost'
port = 9999
server = socket.socket()
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server.bind((host,port))
server.listen(6)
print('listening....')
conn,addr = server.accept()
while True:
data = conn.recv(1024)
filesize = data.decode()
print(filesize)
recvsize = 0
with open('new_san11.rar', 'wb') as f:
print('file opened')
while True:
data = conn.recv(4096)
if not data:
break
f.write(data)
recvsize += len(data)
if int(recvsize) == int(filesize):** #此处就是在发送端read缓存设置为65535后,接收长度就一致了**
break
f.close()
print(recvsize)
print('Successfully get the file')