python網絡編程:socketserver的基本使用



本文內容:

 

  • 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()
      • image
    • 停止server_forever:shutdown()
      • server.shutdown()

 

服務端:

import socketserver

class 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 socket

client=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 socketserver

class 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",9999

server=socketserver.ThreadingTCPServer((HOST,PORT),MyTCPHandler)#多線程版
server.serve_forever()

 

 

 

 



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM