python網路編程:socketserver的基本使用,pythonsocketserver

來源:互聯網
上載者:User

python網路編程:socketserver的基本使用,pythonsocketserver
本文內容:

 

  • socketserver的介紹
  • socketserver的使用
  • socketserver的非同步服務端

 

首發時間:2018-03-21

也可以使用socketserver來建立socket

socketserver的介紹:
  • socketserver是標準庫中的一個進階模組
  • socketserver可以簡化建立用戶端跟建立服務端的代碼

 

socketserver的使用:

 

  • 首先匯入模組:import socketserver
  • 初始化控制器類Handler【Handler是一個繼承BaseRequestHandler的類Handler中的handle方法決定了每一個串連過來的操作】 【控制器類的類名可以是其他的,不一定是Handler,只要繼承了BaseRequestHandler就行】
    • init():初始化控制設定,初始化串連通訊端,地址,處理執行個體等資訊
    • handle(): 定義了如何處理每一個串連。
    • setup(): 在handle()之前執行.一般用作設定預設之外的串連配置
    • finish():在handle()之後執行。
    • 變數:
      • self.request屬性是通訊端對象,所以使用self.request.xxxx調用通訊端的函數
      • self.server包含調用處理常式的執行個體
      • self.client_address是用戶端地址資訊
  • 定義服務端類型【將Handler類和服務端的地址連接埠參數傳入】:
    • TCPServer 支援ipv4的TCP協議的伺服器。
      • server=socketserver.TCPServer((HOST,PORT),Handler)【Handler】
    • UDPServer 支援ipv4的UDP協議的伺服器。
      • server=socketserver.UDPServer((HOST,PORT),Handler)
  • 運行服務端
    • 持續迴圈運行:serve_forever(),即使一個串連報錯了,但不會導致程式停止,而是會持續運行,與其他用戶端通訊
      • server.serve_forever()
    • 停止server_forever:shutdown()
      • server.shutdown()

 

服務端:
import socketserverclass MyTCPHandler(socketserver.BaseRequestHandler):    def handle(self):        try:            while True:                self.data=self.request.recv(1024)                print("{} send:".format(self.client_address),self.data)                if not self.data:                    print("connection lost")                    break                self.request.sendall(self.data.upper())        except Exception as e:            print(self.client_address,"串連斷開")        finally:            self.request.close()    def setup(self):        print("before handle,串連建立:",self.client_address)    def finish(self):        print("finish run  after handle")if __name__=="__main__":    HOST,PORT = "localhost",9999    server=socketserver.TCPServer((HOST,PORT),MyTCPHandler)    server.serve_forever()

 

用戶端:
import socketclient=socket.socket()client.connect(('localhost',9999))while True:    cmd=input("(quit退出)>>").strip()    if len(cmd)==0:        continue    if cmd=="quit":        break    client.send(cmd.encode())    cmd_res=client.recv(1024)    print(cmd_res.decode())client.close()

 

 

socketserver的非同步服務端:

 

多線程:ThreadingTCPServer

多進程:ForkingTCPServer(Unix)

 

多線程版:

import socketserverclass MyTCPHandler(socketserver.BaseRequestHandler):    def handle(self):        try:            while True:                self.data=self.request.recv(1024)                print("{} send:".format(self.client_address),self.data)                if not self.data:                    print("connection lost")                    break                self.request.sendall(self.data.upper())        except Exception as e:            print(self.client_address,"串連斷開")        finally:            self.request.close()    def setup(self):        print("before handle,串連建立:",self.client_address)    def finish(self):        print("finish run  after handle")HOST,PORT = "localhost",9999server=socketserver.ThreadingTCPServer((HOST,PORT),MyTCPHandler)#多線程版server.serve_forever()

 

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.