国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

python利用socketserver實現并發套接字功能

2020-02-22 23:01:05
字體:
來源:轉載
供稿:網友

本文實現利用python的socketserver這個強大的模塊實現套接字的并發,具體內容如下

目錄結構如下:

測試文件請放在server_file文件夾里面

server.py

#!/usr/bin/env python# -*- coding: gbk -*-# @Version : Python 3.5.2# @Time : 2018/1/24 10:29# @Author : Ncp# @File : server.py# @Software: PyCharmimport jsonimport timeimport hashlibimport structimport osfrom socketserver import *FILE_PATH = os.path.dirname(os.path.abspath(__file__))+'//server_file'class MYserver(BaseRequestHandler): # 設置一個類,基礎BaseRequestHandler這個類 def handle(self):     # 這個方法下添加通信功能(和上面創建類一樣,這是socketserver的固定模式)  print(self.client_address)  '''  :functions: 使用socketserver的并發套接字,提供客戶端下載文件,并對文件進行MD5加密  '''  while True:   try:    data = self.request.recv(1024)    data_recv = data.decode('gbk').split()    if not os.path.exists(FILE_PATH+r'/%s' %data_recv[1]):     self.request.send('file is not found'.encode('gbk'))     continue    else:     data = self.request.send('1'.encode('gbk')) # 這里發現小問題,不回復一個信息的話,發送給客戶端的包頭居然成了沒有封裝     FILE_SIZE = os.path.getsize(FILE_PATH+r'/%s' %data_recv[1])     with open(FILE_PATH+r'/%s' %data_recv[1],'rb')as f:      hash_file = f.read()     m = hashlib.md5()     m.update(hash_file)     m_hex = m.hexdigest()     file_header = {'filename':data_recv[1],         'filesize':FILE_SIZE,         'md5':m_hex,         'time':time.strftime('%Y-%m-%d-%X',time.localtime())         }     # 包頭信息序列化     file_header_dump = json.dumps(file_header)     # 編譯成2進制     file_header_bytes = file_header_dump.encode('gbk')     # 封裝報頭     file_header_struct = struct.pack('i',len(file_header_bytes))     # 發送報頭     self.request.send(file_header_struct)     # 發送報文內容     self.request.send(file_header_bytes)     # 發送文件數據     send_size = 0     with open(FILE_PATH+r'/%s' %data_recv[1] , 'rb')as f:      for i in f:       self.request.send(i)       send_size += len(i) # 這里后續可以拓展一個進度或者網速顯示功能   except Exception:    self.request.close()if __name__ == '__main__': server = ThreadingTCPServer(('127.0.0.1',8080),MYserver) # windows下只能開啟多線程 server.serve_forever()

client.py

#!/usr/bin/env python# -*- coding: gbk -*-# @Version : Python 3.5.2# @Time : 2018/1/24 10:29# @Author : Ncp# @File : client.py# @Software: PyCharmfrom socket import *import os,sysimport hashlibimport structimport mathimport jsonFILE_PATH = os.path.dirname(os.path.abspath(__file__))+'//client_file'# 顯示下載進度條功能,可以拓展為顯示下載速度(提示,因為每次傳輸4096個字節,那么下載網速為KB/S,1KB個字節=1024B(字節),那么1s傳輸了多少個字節呢?)def progress(recvd, total): fraction = '{:.0%}'.format(recvd / total) sys.stdout.write('/r[%-30s] %s' % ('#' * int(math.floor(recvd * 30 / total)), fraction)) sys.stdout.flush() if recvd == total:  sys.stdout.write('/n')# 主函數def run(ip,addr): client = socket(AF_INET,SOCK_STREAM) client.connect((ip,addr)) while True:  user_input = input('>>').strip()  cmd = user_input.split()  if len(cmd) != 2:   print('input format is error please use:get xx')   continue  if cmd[0] == 'get':   client.send(user_input.encode('gbk'))   data = client.recv(1024)   data_recv = data.decode('gbk')   if data_recv == 'file is not found':    print(data_recv)    continue  else:   print('commands is not found')   continue  # 收包頭,然后一系列處理  header = client.recv(4)  if not header:break  header_json_len = struct.unpack('i', header)[0]  header_json_bytes = client.recv(header_json_len)  header_josn = header_json_bytes.decode('gbk')  header_dic = json.loads(header_josn)  # 去除包頭內容進行下載  print(header_dic)  data_len = header_dic['filesize']  data_file = header_dic['filename']  data_md5 = header_dic['md5']  recv_size = 0  with open(FILE_PATH+r'/%s' %data_file,'wb')as fw:   while recv_size < data_len:    recv_data = client.recv(4096)    recv_size += len(recv_data)    fw.write(recv_data)    progress(recv_size,data_len)   print('Download completion, start validation')  # 收到文件后,讀取文件進行加密,看是否與服務端下載的文件一致!  with open(FILE_PATH+r'/%s' %data_file,'rb')as fr:   data_total = fr.read()  m = hashlib.md5()  m.update(data_total)  m_hex = m.hexdigest()  if m_hex == data_md5:   print('文件驗證通過')  else:   print('文件損壞,刪除文件')   os.remove(FILE_PATH+r'/%s' %data_file)if __name__ == '__main__': run('127.0.0.1',8080)            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 扎鲁特旗| 油尖旺区| 许昌市| 朝阳区| 泗洪县| 五莲县| 赫章县| 如皋市| 牟定县| 巫山县| 怀宁县| 佳木斯市| 正镶白旗| 勐海县| 青浦区| 平安县| 华安县| 城口县| 濉溪县| 张北县| 香格里拉县| 开阳县| 偃师市| 西乌| 钟山县| 马鞍山市| 邓州市| 资源县| 郓城县| 安福县| 永泰县| 嘉黎县| 鹿泉市| 河曲县| 含山县| 雷波县| 黔南| 夏河县| 左权县| 张家界市| 镇远县|