歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Python socket上傳文件的服務端和客戶端實現

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

日期:2017/3/1 10:50:51   编辑:Linux編程

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

服務端:

  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