python socket上传文件的服务端和客户端实现

python socket上传文件的服务端和客户端实现 - 玩命写博客 - 博客频道 - CSDN.NET

python socket上传文件的服务端和客户端实现

分类: python小毒蛇 323人阅读 评论(0) 收藏 举报

代码均已测试:希望高人能指点一二

服务端: 

 

[python] view plain copy print ?
  1. #coding=gbk  
  2. ''''' 
  3. 等待连接 
  4. 等待发送文件 
  5. 读取数据 
  6. 写入文件并且保存 
  7. 等待连接 
  8. '''  
  9. import socket  
  10. import threading  
  11. import time  
  12. import struct  
  13. def function(newsock, address):  
  14.     FILEINFO_SIZE = struct.calcsize('128sI')  
  15.     '''''定义文件信息(包含文件名和文件大小)大小。128s代表128个char[](文件名),I代表一个integer or long(文件大小)'''  
  16.     while 1:       
  17.         try:  
  18.             fhead = newsock.recv(FILEINFO_SIZE)  
  19.             filename, filesize = struct.unpack('128sI', fhead)  
  20.             '''''把接收到的数据库进行解包,按照打包规则128sI'''  
  21.             print "address is: ",address  
  22.             print filename, len(filename),type(filename)  
  23.             print filesize  
  24.             filename = 'new_'+filename.strip('\00')#命名新文件new_传送的文件  
  25.             fp = open(filename,'wb')#新建文件,并且准备写入  
  26.             restsize = filesize  
  27.             print "recving..."  
  28.             while 1:  
  29.                 if restsize > 1024:#如果剩余数据包大于1024,就去1024的数据包  
  30.                     filedata = newsock.recv(1024)  
  31.                 else:  
  32.                     filedata = newsock.recv(restsize)  
  33.                     fp.write(filedata)  
  34.                     break  
  35.                 if not filedata:  
  36.                     break  
  37.                 fp.write(filedata)  
  38.                 restsize = testsize - len(filedata)#计算剩余数据包大小  
  39.                 if restsize <= 0:  
  40.                     break  
  41.             fp.close()  
  42.             print "recv succeeded !!File named:",filename  
  43.         except:  
  44.             print "he socket partner maybe closed"  
  45.             newsock.close()  
  46.             break  
  47. sock=socket.socket(socket.AF_INET, socket.SOCK_STREAM)#创建tcp连接  
  48. sock.bind(('127.0.0.1',8887))#定于端口和ip  
  49. sock.listen(5)#监听  
  50. while True:  
  51.     newsock, address = sock.accept()  
  52.     print "accept another connection"  
  53.     tmpThread = threading.Thread(target=function,args=(newsock,address)) #如果接收到文件,创建线程  
  54.     tmpThread.start()#执行线程  
  55. print 'end'  
#coding=gbk
'''
等待连接
等待发送文件
读取数据
写入文件并且保存
等待连接
'''
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_传送的文件
            fp = open(filename,'wb')#新建文件,并且准备写入
            restsize = filesize
            print "recving..."
            while 1:
                if restsize > 1024:#如果剩余数据包大于1024,就去1024的数据包
                    filedata = newsock.recv(1024)
                else:
                    filedata = newsock.recv(restsize)
                    fp.write(filedata)
                    break
                if not filedata:
                    break
                fp.write(filedata)
                restsize = testsize - len(filedata)#计算剩余数据包大小
                if restsize <= 0:
                    break
            fp.close()
            print "recv succeeded !!File named:",filename
        except:
            print "he socket partner maybe closed"
            newsock.close()
            break
sock=socket.socket(socket.AF_INET, socket.SOCK_STREAM)#创建tcp连接
sock.bind(('127.0.0.1',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'

 


客户端: 

 

[python] view plain copy print ?
  1. #coding=gbk  
  2. ''''' 
  3. 输入文件名,并且上传 
  4. '''  
  5. import socket  
  6. import time  
  7. import struct  
  8. import os  
  9. sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)  
  10. sock.settimeout(1)  
  11. e=0  
  12. try:  
  13.     sock.connect(('127.0.0.1',8887))  
  14.     print 'connect...'  
  15. except socket.timeout,e:  
  16.     print 'timeout',e  
  17. except socket.error,e:  
  18.     print 'error',e  
  19. except e:  
  20.     print 'any',e  
  21. if not e:  
  22.     while (1):  
  23.         filename = raw_input('input your filename------->')#输入文件名  
  24.         FILEINFO_SIZE = struct.calcsize('128sI')#编码格式大小  
  25.         fhead = struct.pack('128sI',filename,os.stat(filename).st_size)#按照规则进行打包  
  26.         sock.send(fhead)#发送文件基本信息数据  
  27.         fp = open(filename,'rb')  
  28.         while 1:        #发送文件  
  29.             filedata = fp.read(1024)  
  30.             if not filedata:  
  31.                 break  
  32.             sock.send(filedata)  
  33.         print "sending over..."  
  34.         fp.close()  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值