歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Python socket上傳文件的服務端和客戶端實現

代碼均已測試:希望高人能指點一二

服務端: 

  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'  


客戶端: 

  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()  
Copyright © Linux教程網 All Rights Reserved