python传输大文件_Python大文件传输

该博客介绍了如何使用Python通过TCP协议实现大文件的传输。分别展示了`socker_server.py`和`socker_client.py`两个文件的代码,用于创建服务器端和客户端,通过socket进行文件的发送和接收。服务器端读取配置文件`properties`,获取文件信息,并在接收到客户端的确认后发送文件。客户端连接服务器,接收文件并保存。整个过程包含了TCP的三次握手和文件的分块接收。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

socker_server.py:

实现功能:获取yaml中的文件信息,用soket进行文件传输(TCP+三次握手)

socker_client.py:

实现功能:利用server端传过来的文件信息做校验,并继续文件接收

properties:

为yaml文件,储存文件信息

#file:socker_server.py

#_*_coding:utf-8_*_

#by Linhut

#time:2017/4/8

import SocketServer,yaml,json

class socketHandler(SocketServer.BaseRequestHandler):

def setup(self):

print '\033[32mServer starting successful ....\033[0m'

with open('F:/cgi-bin/p2/config/properties', 'r') as f:

content = f.read() #读出来内容

self.cfg = yaml.load(content) #通过yaml变成字典

def handle(self):

conn = self.request #把客户端的soket对象收到

first_mgs = conn.recv(1024) #判断第一次握手成功,发生文件头部

if first_mgs == 'successful':

with open(self.cfg['file_matadata']['filepath'],'rb') as f: #rb打开文件

self.content = f.read()

filesize = len(self.content)

self.cfg['file_matadata']['filesize'] = filesize # raml文件赋值文件大小

ack_msg = json.dumps(self.cfg).encode()

conn.send(ack_msg) #给客户端发送信息

else:

print 'client failed...'

if conn.recv(1024) == 'start':

conn.send(self.content)

finish_msg = conn.recv(1024)

print finish_msg

def finish(self):

pass

class socketserever(SocketServer.TCPServer):

pass

class MyServer(SocketServer.TCPServer,SocketServer.ThreadingMixIn):

pass

if __name__=='__main__':

server = socketserever(('127.0.0.1',2010),socketHandler)

server.serve_forever()

#file:socker_client.py

#_*_coding:utf-8_*_

#by Linhut

#time:2017/4/8

import socket,json,sys,time

recv_file = b''

recv_size = 0

server_address = ('127.0.0.1',2010)

sock =socket.socket(socket.AF_INET,socket.SOCK_STREAM)

for i in range(5):

try:

sock.connect(server_address)

break

except Exception as e:

print 'client connection server \033[31mfailad\033[0m,please 3s retry..'

time.sleep(3)

else:

print 'client exit..'

sys.exit(10)

sock.send('successful')

ack_msg = json.loads(sock.recv(1024).decode()) #拿ack信息

print ack_msg

if ack_msg['file_matadata']:

filename = ack_msg['file_matadata']['filename']

filesize = ack_msg['file_matadata']['filesize']

name = raw_input('raw_input you locla filename:')

save_file_path = 'C:/Users/T530_I7QM/Desktop/%s.pdf'%name

sock.send('start') #告诉服务器端可以发送数据了

while recv_size < filesize:

content = sock.recv(2048)

recv_file += content

recv_size += 2048

print '[%s] recv_size:%s'%(filename,recv_size)

else:

with open(save_file_path,'ab+') as f:

f.write(recv_file)

sock.send('\033[32m client recv finished\033[0m') #完成并发生一个消息

print '\033[32m recv finished.. \033[0m'

#file:properties

ack_msg:

filename: qqq.pdf

filepath: C:/Users/T530_I7QM/Desktop/qqq.pdf

filesize:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值