使用python socket多线程实现大文件分发
来源:互联网 发布:ubuntu删除搜狗输入法 编辑:程序博客网 时间:2024/05/16 09:12
一、服务器端代码
#!/usr/bin/env python#-*- coding:utf-8 -*-#environment:2.7#在python3中,模块不是SocketServer,而是socketserverimport os,json,time,SocketServer,threadingfile_path = '/root/update/123.txt'def take_hander(file_path,code='utf-8'): ''' 这个函数是用来生成文件头以及对文件的处理 :param file_path: :param code: :return: ''' file_name_list = file_path.rsplit(os.sep,1) if len(file_name_list) > 1: file_name = file_name_list[1] else: file_name = file_path file_size = os.path.getsize(file_path) date = time.strftime('%Y-%m-%d %X',time.localtime()) head_data = { 'file_name':file_name, 'file_size':file_size, 'date':date, 'charset':code } file_head = json.dumps(head_data) return file_head#设置SocketServer的handleclass Myhandler(SocketServer.BaseRequestHandler): def setup(self): #类似于构造函数,setup不可用接收参数 self.file = open(file_path,'r') self.content = self.file.read() self.file_head = take_hander(file_path) def handle(self): #self.client_address 是模块类当中以及设置好的存储client的ip和端口 #self.request是模块类中已经设置好的接收和发送信息的对象,是一个socker对象 print('%s:%s is connected' % self.client_address) request_data = self.request.recv(1024) print(request_data) self.request.send(self.file_head) #把头部内容发送过去 request_data1 = self.request.recv(1024) print(request_data1) self.request.sendall(self.content) #发送文件内容 def finish(self): #类似于类中的析构函数 print('%s is done' %self.file) if self.file.closed == False: self.file.close()#通过多继承形成新的支持多线程服务器 class Myserver(SocketServer.TCPServer,SocketServer.ThreadingMixIn): passif __name__ == '__main__': ip_port = ('127.0.0.1',9600) m = Myserver(ip_port,Myhandler) p = threading.Thread(target=m.serve_forever,args=()) p.start() #m.shutdown() #m.server_close()
二、客户端代码
#!/usr/bin/env python#-*- coding:utf-8 -*-#environment:2.7import socket,jsonwhile True: sk = socket.socket(socket.AF_INET,socket.SOCK_STREAM) ip_port = ('127.0.0.1',9600) sk.connect(ip_port) user_input = raw_input('>>>:').strip() if len(user_input) == 0:continue if user_input == 'q':break sk.send(user_input) server_head_msg = json.loads(sk.recv(1024)) print(server_head_msg) #文件名res_name,文件大小res_size res_name = server_head_msg['file_name'] res_size = server_head_msg['file_size'] sk.send('已经收到头部信息,可以发送数据了') num = res_size/256.0 if num != int(num): num = int(num) +1 else: num = int(num) for i in range(num): content = sk.recv(1024) print(content)
阅读全文
0 0
- 使用python socket多线程实现大文件分发
- 使用python socket分发大文件
- python使用socket实现多线程端口扫描
- 使用Java多线程实现任务分发
- 使用Java多线程实现任务分发
- 使用Java多线程实现任务分发
- 使用Java多线程实现任务分发
- 使用Java多线程实现任务分发
- socket 多线程实现文件上传下载
- Python socket分发消息例子
- Python使用socket传输文件
- 结合P2P软件使用Ansible分发大文件
- 结合P2P软件使用Ansible分发大文件
- 使用python读取大文件
- 使用python读取大文件
- java 多线程实现任务分发
- java 多线程实现任务分发
- python实现用socket传输文件
- 版本号命名规则
- 获取window系统版本GetVersionEx
- zabbix密钥监控mysal、nginx、php
- Python基础篇之列表生成式
- android md5求hash值
- 使用python socket多线程实现大文件分发
- 【转载】Makefile经典教程
- 百度ai—细粒度图像识别
- 安装MySQL解压版
- EBS与外来项目系统对接接口BOM AND ECN interface coding
- mysql 搜寻附近N公里内数据的实例
- MFC环形进度条实现
- 第一天
- Spring framework(4):IoC (2) Bean 装配