本篇文章主要介绍了 python:socket 传输大文件示例,具有一定的参考价值,有兴趣的可以了解一下,
Python 是一种面向对象、解释型计算机程序设计语言,由 Guido van Rossum 于 1989 年底发明,第一个公开发行版发行于 1991 年。Python 语法简洁而清晰,具有丰富和强大的类库。它常被昵称为胶水语言,它能够把用其他语言制作的各种模块(尤其是 C/C++)很轻松地联结在一起。
文件可以传输,但是对比传输前后的文件:socket_test.txt,末尾有一些不一致服务端代码:
- #!/usr/bin/python
- # -*- coding: utf-8 -*-
- import sys
- reload(sys)
- sys.setdefaultencoding("utf-8")
- import time
- '''
- 等待连接
- 等待发送文件
- 读取数据
- 写入文件并且保存
- 等待连接
- '''
- import socket
- import threading
- import time
- import struct
- def function(newsock, address):
- FILEINFO_SIZE = struct.calcsize('128sI')
- '''定义文件信息(包含文件名和文件大小)大小。128s代表128个char[](文件名),I代表一个integer or long(文件大小)'''
- while 1:
- try:
- fhead = newsock.recv(FILEINFO_SIZE)
- filename, filesize = struct.unpack('128sI', fhead)
- '''把接收到的数据库进行解包,按照打包规则128sI'''
- print "address is: ", address
- print filename, len(filename), type(filename)
- print filesize
- #filename = 'new_'+filename.strip('\00') # 命名新文件new_传送的文件
- filename = filename.strip('\00')
- fp = open(filename, 'wb') # 新建文件,并且准备写入
- restsize = filesize
- print "recving..."
- while 1:
- if restsize > 102400: # 如果剩余数据包大于1024,就去1024的数据包
- filedata = newsock.recv(10240)
- else:
- filedata = newsock.recv(restsize)
- fp.write(filedata)
- #break
- if not filedata:
- break
- fp.write(filedata)
- restsize = restsize - len(filedata) # 计算剩余数据包大小
- if restsize <= 0:
- break
- fp.close()
- print "recv succeeded !!File named:", filename
- except Exception, e:
- print unicode(e).encode('gbk')
- print "the socket partner maybe closed"
- newsock.close()
- break
- sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 创建tcp连接
- sock.bind(('10.240.146.82', 8887)) # 定于端口和ip
- sock.listen(5) # 监听
- while True:
- newsock, address = sock.accept()
- print "accept another connection"
- tmpThread = threading.Thread(target=function, args=(newsock, address)) # 如果接收到文件,创建线程
- tmpThread.start() # 执行线程
- print 'end'
客户端代码:
- #!/usr/bin/python
- # -*- coding: utf-8 -*-
- import sys
- reload(sys)
- sys.setdefaultencoding("utf-8")
- '''
- 输入文件名,并且上传
- '''
- import socket
- import time
- import struct
- import os
- f = open('socket_test.txt', 'wb')
- for i in range(1000000):
- f.write('for socket test, the line number is : ' + str(i) + '\n')
- f.close()
- sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- sock.settimeout(50)
- e = 0
- try:
- sock.connect(('10.240.146.82', 8887))
- print 'connect...'
- except socket.timeout, e:
- print 'timeout', e
- except socket.error, e:
- print 'error', e
- except e:
- print 'any', e
- if not e:
- #while (1):
- #filename = raw_input('input your filename------->') # 输入文件名
- filename = 'socket_test.txt'
- FILEINFO_SIZE = struct.calcsize('128sI') # 编码格式大小
- fhead = struct.pack('128sI', filename, os.stat(filename).st_size) # 按照规则进行打包
- sock.send(fhead) # 发送文件基本信息数据
- fp = open(filename, 'rb')
- fp2 = open('local_test.txt','wb')
- i = 0
- while 1: # 发送文件
- filedata = fp.read(10240)
- if not filedata:
- break
- sock.sendall(filedata)
- fp2.write(filedata)
- print i
- i = i + 1
- print "sending over..."
- fp.close()
- fp2.close()
来源: