一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

python:socket传输大文件示例

时间:2017-02-04 编辑:简简单单 来源:一聚教程网

文件可以传输,但是对比传输前后的文件:socket_test.txt,末尾有一些不一致服务端代码:

 

 代码如下复制代码

#!/usr/bin/python

# -*- coding: utf-8 -*-

importsys

reload(sys)

sys.setdefaultencoding("utf-8")

importtime

'''

等待连接

等待发送文件

读取数据

写入文件并且保存

等待连接

'''

importsocket

importthreading

importtime

importstruct

 

 

deffunction(newsock, address):

  FILEINFO_SIZE=struct.calcsize(飘sI')

  '''定义文件信息(包含文件名和文件大小)大小。128s代表128个char[](文件名),I代表一个integer or long(文件大小)'''

  while1:

    try:

      fhead=newsock.recv(FILEINFO_SIZE)

      filename, filesize=struct.unpack(飘sI', fhead)

      '''把接收到的数据库进行解包,按照打包规则128sI'''

      print"address is: ", address

      printfilename,len(filename),type(filename)

      printfilesize

      #filename = 'new_'+filename.strip('\00') # 命名新文件new_传送的文件

      filename=filename.strip('\00')

      fp=open(filename,'wb')# 新建文件,并且准备写入

      restsize=filesize

      print"recving..."

      while1:

        ifrestsize >102400:# 如果剩余数据包大于1024,就去1024的数据包

          filedata=newsock.recv(10240)

        else:

          filedata=newsock.recv(restsize)

          fp.write(filedata)

          #break

        ifnotfiledata:

          break

        fp.write(filedata)

        restsize=restsize-len(filedata)# 计算剩余数据包大小

        ifrestsize <=0:

          break

      fp.close()

      print"recv succeeded !!File named:", filename

    exceptException, e:

      printunicode(e).encode('gbk')

      print"the socket partner maybe closed"

      newsock.close()

      break

sock=socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 创建tcp连接

sock.bind((ཆ.240.146.82',8887))# 定于端口和ip

sock.listen(5)# 监听

whileTrue:

  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 -*-

importsys

reload(sys)

sys.setdefaultencoding("utf-8")

'''

输入文件名,并且上传

'''

importsocket

importtime

importstruct

importos

f=open('socket_test.txt','wb')

 

foriinrange(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((ཆ.240.146.82',8887))

  print'connect...'

exceptsocket.timeout, e:

  print'timeout', e

exceptsocket.error, e:

  print'error', e

excepte:

  print'any', e

ifnote:

  #while (1):

    #filename = raw_input('input your filename------->') # 输入文件名

  filename='socket_test.txt'

  FILEINFO_SIZE=struct.calcsize(飘sI')# 编码格式大小

  fhead=struct.pack(飘sI', filename, os.stat(filename).st_size)# 按照规则进行打包

  sock.send(fhead)# 发送文件基本信息数据

  fp=open(filename,'rb')

  fp2=open('local_test.txt','wb')

  i=0

  while1:# 发送文件

    filedata=fp.read(10240)

    ifnotfiledata:

      break

    sock.sendall(filedata)

    fp2.write(filedata)

    printi

    i=i+1

  print"sending over..."

  fp.close()

  fp2.close()

 

热门栏目