資源簡介
此代碼基于python實現了服務器/客戶端的斷點續傳,可以作為網絡編程中的參考。

代碼片段和文件信息
#!/usr/bin/env?python?
#???--coding?=?utf-8?
#???Author?Allen?Lee?
import?socket?os?json?sys
import?struct
import?time
import?sys
class?Myclient():
????#?在構造方法中啟動client的socket對象以及連接server端
????def?__init__(self):
????????self.client?=?socket.socket()
????????self.client.connect((‘127.0.0.1‘?9909))
????#?main為client的主方法,其中通過對用戶輸入的命令來判斷具體操作,并通過反射將其引導到對應的方法
????#?!/usr/bin/python3
????def?clear(self):
?????????os.system(‘cls‘)
????def?main(self):
????????while?True:
????????????res_data?=?self.client.recv(1024).strip()
????????????if?not?res_data:
????????????????break
????????????print(str(res_data?encoding=‘utf-8‘))
????????????print(‘請輸入命令?put:發送文件\n‘)
????????????send_data?=?input(‘>>:?‘).strip()
????????????if?not?send_data:
????????????????continue
????????????if?hasattr(self?send_data):
????????????????getattr(self?send_data)(send_data)
????????????else:
????????????????self.client.close()
????????????#?當用戶輸入的不是指定的put方法時,退出
????
????def?put(self?send_data):
????????pathh?=?input(‘Input?the?file’s?path?:‘)
????????#?首先判斷文件是否存在,通過os.path.isfile來實現
????????ret?=?os.path.isfile(pathh)
????????if?not?ret:
????????????print(‘The?file?is?not?exist‘)
????????????return?False
????????#?如果存在,則將操作類型、文件名、文件大小以字典形勢格式化,再以json的方法進行格式化
????????else:
????????????#?通過os.stat方法來取文件的大小
????????????file_size?=?os.stat(pathh).st_size
????????????file_name?=?os.path.basename(pathh)
????????????self.client.send(bytes(send_dataencoding=‘utf-8‘))
????????????time.sleep(1)
????????????print(send_data)
????????????print(file_name)
????????????self.client.send(bytes(file_name?encoding=‘utf-8‘))
????????????time.sleep(1)
????????????print(file_size)
????????????self.client.send(str(file_size).encode(‘utf-8‘))
????????????res_tag?=?str(self.client.recv(1024).decode(‘utf-8‘))
????????????print(res_tag)???####打印接受的ok或continue
????????????if?not?res_tag:
????????????????return?False
????????????if?res_tag.startswith(‘ok‘):
????????????????#?上傳文件只用r就夠了
????????????????with?open(pathh?‘rb‘)?as?f:
????????????????????new_size?=?0
????????????????????scale?=?file_size//1024
????????????????????while?True:
????????????????????????try:
????????????????????????????for?i?in?range(scale?+?1):
????????????????????????????????filedata?=?f.read(1024)
????????????????????????????????#?print(filedata)
????????????????????????????????new_size?+=?len(filedata)
????????????????????????????????if?not?filedata:
????????????????????????????????????break
????????????????????????????????self.client.send(filedata)
????????????????????????????????self.progres(new_size?file_size)
????????????????????????????????time.sleep(0.1)
????????????????????????except?KeyboardInterrupt:
????????????????????????????self.client.close()
????????????if?res_tag.startswith(‘continue‘):
????????????????with?open(pathh?‘rb+‘)?as?f:
????????????????????#?此處使用seek來進行文件指針的偏移,進而完成斷點續傳的功能
????????????????????sendd_data?
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件????????5716??2018-11-18?19:55??c_f.py
?????文件????????3580??2018-11-18?19:55??s_f.py
評論
共有 條評論