使用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)