Socketserver詳解


Python3中的SocketServer
  socket並不能多並發,只能支持一個用戶,socketserver 簡化了編寫網絡服務程序的任務,socketserver是socket的在封裝。socketserver在python2中為SocketServer,在python3種取消了首字母大寫,改名為socketserver。socketserver中包含了兩種類,一種為服務類(server class),一種為請求處理類(request handle class)。前者提供了許多方法:像綁定,監聽,運行…… (也就是建立連接的過程) 后者則專注於如何處理用戶所發送的數據(也就是事務邏輯)。一般情況下,所有的服務,都是先建立連接,也就是建立一個服務類的實例,然后開始處理用戶請求,也就是建立一個請求處理類的實例。
 
socketserver一共有這么幾種類型:
 
1. class socketserver.TCPServer(server_address, RequestHandlerClass, bind_and_activate=True)
2. class socketserver.UDPServer(server_address, RequestHandlerClass, bind_and_activate=True)
3. class socketserver.UnixStreamServer(server_address, RequestHandlerClass, bind_and_activate=True)
4. class socketserver.UnixDatagramServer(server_address, RequestHandlerClass,bind_and_activate=True)
 
繼承關系圖:
+------------+
| BaseServer | 
+------------+
      |
      v
+-----------+        +------------------+
| TCPServer |------->| UnixStreamServer |
+-----------+        +------------------+
      |
      v
+-----------+        +--------------------+
| UDPServer |------->| UnixDatagramServer |
+-----------+        +--------------------+
 
如何創建一個socketserver :
 
  1. First, you must create a request handler class by subclassing the BaseRequestHandlerclass and overriding its handle() method; this method will process incoming requests.   
  2. Second, you must instantiate one of the server classes, passing it the server’s address and the request handler class.
  3. Then call the handle_request() orserve_forever() method of the server object to process one or many requests.
  4. Finally, call server_close() to close the socket.
 
  1. 創建一個請求處理的類,並且這個類要繼承  BaseRequestHandlerclass ,並且還要 重寫父類里handle()方法;
注釋:為什么要重寫handle方法時加上while循環  
        handle方法默認結束后斷開鏈接繼續監聽  
  2. 你必須實例化 TCPServer,並且傳遞server IP和你上面創建的請求處理類,給這個TCPServer;
  3. server.handle_requese()#只處理一個請求,server.server_forever()處理多個一個請求,永遠執行
  4. 關閉連接server_close()
 
import socketserver
class MyServer(socketserver.BaseRequestHandler):
    def handle(self):
        # 創建一個鏈接,繼承於socketserver中的BaseRequestHandler類
        conn = self.request
        # 發送登錄提示
        conn.sendall(b"Welcome to login...")
        print("Client connect...")
        while True:
            print("Waitting for recving message...")
            # 接收消息
            message = conn.recv(1024)
            print(message.decode('utf-8'))
            # 收到exit就退出
            if message == "exit":
                break
            # 回復消息
            data = input("Reply message:")
            # 發送消息
            conn.sendall(data.encode('utf-8'))
if __name__ == "__main__":
   # 實例化
    server = socketserver.ThreadingTCPServer(('127.0.0.1', 999, ), MyServer)
    # 調用serve_forever方法
    server.serve_forever()
'''
def serve_forever(self, poll_interval=0.5):
    """
    Handle one request at a time until shutdown.
    Polls for shutdown every poll_interval seconds. Ignores
    self.timeout. If you need to do periodic tasks, do them in
    another thread.
    """
'''
multi_socketserver_client.py

# 就是一個簡單的TCP客戶端
import socket
sock = socket.socket()
# 連接服務端
sock.connect(('127.0.0.1', 999, ))
login = sock.recv(1024)
print(login.decode('utf-8'))
while True:
    message = input("Please input the message:").strip()
    if message == "exit":
        sock.sendall(b'exit')
        break
    else:
        sock.sendall(message.encode('utf-8'))
        print("Waitting for recving message...")
        data = sock.recv(1024)
        print(data.decode('utf-8'))
sock.close()

 

 
 


免責聲明!

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



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