通过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')