python學習_day41_socketserver模組

來源:互聯網
上載者:User

標籤:windows系統   main   eve   http   join   reading   max   server   write   

一、socketserver實現並發編程

  如socketserver模組中包含基於多線程實現並發編程的類和基於多進程的實現並發編程的類,它其實內部的實現的機制是將我們之前學習實現多線程、多進程的過程封裝,按照特定的流程就可以使用,其中常用的還是基於tcp協議通訊,多線程的用到的模組是ThreadingTCPServer,多進程用到的模組是ForkingTCPServer,需要說明的是socketserver模組中多進程不能在windows系統中實現,因此這裡暫時先主要介紹一下基於TCP協議的多線程實現的方式。

  FTP多使用者通訊執行個體:

#服務端import socketserverimport structimport jsonimport osclass FtpServer(socketserver.BaseRequestHandler):    coding=‘utf-8‘    server_dir=‘file_upload‘    max_packet_size=1024    BASE_DIR=os.path.dirname(os.path.abspath(__file__))    def handle(self):        print(self.request)        while True:            data=self.request.recv(4)            data_len=struct.unpack(‘i‘,data)[0]            head_json=self.request.recv(data_len).decode(self.coding)            head_dic=json.loads(head_json)            # print(head_dic)            cmd=head_dic[‘cmd‘]            if hasattr(self,cmd):                func=getattr(self,cmd)                func(head_dic)    def put(self,args):        file_path = os.path.normpath(os.path.join(            self.BASE_DIR,            self.server_dir,            args[‘filename‘]        ))        filesize = args[‘filesize‘]        recv_size = 0        print(‘----->‘, file_path)        with open(file_path, ‘wb‘) as f:            while recv_size < filesize:                recv_data = self.request.recv(self.max_packet_size)                f.write(recv_data)                recv_size += len(recv_data)                print(‘recvsize:%s filesize:%s‘ % (recv_size, filesize))ftpserver=socketserver.ThreadingTCPServer((‘127.0.0.1‘,8080),FtpServer)ftpserver.serve_forever()
import socketimport structimport jsonimport osclass MYTCPClient:    address_family = socket.AF_INET    socket_type = socket.SOCK_STREAM    allow_reuse_address = False    max_packet_size = 8192    coding=‘utf-8‘    request_queue_size = 5    def __init__(self, server_address, connect=True):        self.server_address=server_address        self.socket = socket.socket(self.address_family,                                    self.socket_type)        if connect:            try:                self.client_connect()            except:                self.client_close()                raise    def client_connect(self):        self.socket.connect(self.server_address)    def client_close(self):        self.socket.close()    def run(self):        while True:            inp=input(">>: ").strip()            if not inp:continue            l=inp.split()            cmd=l[0]            if hasattr(self,cmd):                func=getattr(self,cmd)                func(l)    def put(self,args):        cmd=args[0]        filename=args[1]        if not os.path.isfile(filename):            print(‘file:%s is not exists‘ %filename)            return        else:            filesize=os.path.getsize(filename)        head_dic={‘cmd‘:cmd,‘filename‘:os.path.basename(filename),‘filesize‘:filesize}        print(head_dic)        head_json=json.dumps(head_dic)        head_json_bytes=bytes(head_json,encoding=self.coding)        head_struct=struct.pack(‘i‘,len(head_json_bytes))        self.socket.send(head_struct)        self.socket.send(head_json_bytes)        send_size=0        with open(filename,‘rb‘) as f:            for line in f:                self.socket.send(line)                send_size+=len(line)                print(send_size)            else:                print(‘upload successful‘)client=MYTCPClient((‘127.0.0.1‘,8080))client.run()

  上例中實現並發多線程是在服務端,主要實現見如下多使用者通訊執行個體:

  服務端:

import socketserverclass Myserver(socketserver.BaseRequestHandler):                         #必須建立一個類,並繼承socketserver.BaseRequestHandler類    def handle(self):                                                    #這個方法必須有,而且方法名不可以更改,它是執行個體建立串連後自動執行的方法        while True:            data=self.request.recv(1024)                                 #self.request相當於conn            if not data:break            self.request.send(data.upper())if __name__ == ‘__main__‘:    server=socketserver.ThreadingTCPServer((‘127.0.0.1‘,8090),Myserver)  #執行個體化一個對象    server.serve_forever()                                               #迴圈建立串連

  用戶端:

import socketclient=socket.socket(socket.AF_INET,socket.SOCK_STREAM)client.connect((‘127.0.0.1‘,8090))while True:    msg=input(‘>>>‘).strip()    if  not msg:        continue    client.send(msg.encode())    data=client.recv(1024)    print(data.decode())

 

python學習_day41_socketserver模組

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.