python網路程式設計 socketserver模組
阿新 • • 發佈:2021-06-21
4、socketserver模組
- socketserver中包含了兩種類,一種為服務類(server class),一種為請求處理類(request handle class)。前者提供了許多方法:像繫結,監聽,執行…… (也就是建立連線的過程)後者則專注於如何處理使用者所傳送的資料(也就是事務邏輯)。
- socketserver是標準庫中的一個高階模組(Python2.x中名為SocketServer)。
- socketserver的目標是簡化建立網路客戶端和伺服器的程式碼。(隱藏了實現細節)
- socketserver是使用類來編寫應用程式。
- 以面向物件的方式處理事務有助於組織資料,以及邏輯性地將功能放在正確的地方。應用程式現在是事件驅動的,這意味著只有在系統中的事件發生時,它們才會工作。
- socketserver模組是一個以socket為基礎而建立的高階套接字通訊模組,它支援客戶端請求的執行緒和多程序處理。
- 在原始伺服器迴圈中,我們阻塞等待請求,當接收到請求時就對其提供服務,然後繼續等待。
- 在socketserver的伺服器迴圈中,並非在伺服器中建立程式碼,而是定義一個處理程式,這樣當伺服器接收到一個傳入的請求時,伺服器就可以呼叫你的函式。
- socketserver模組類
- 用socketserver建立一個服務的步驟:
- 1、建立一個request handler class(請求處理類),合理選擇StreamRequestHandler和DatagramRequestHandler之中的一個作為父類(當然,使用BaseRequestHandler作為父類也可),並重寫它的handle()方法。
- 2、例項化一個server class物件,並將服務的地址和之前建立的request handler class傳遞給它。
- 3、呼叫server class物件的handle_request() 或 serve_forever()方法來開始處理請求。
- socketserver請求處理程式的預設行為是接受連線、獲取請求,然後關閉連線。由於這個原因,我們不能在應用程式整個執行過程中都保持連線,因此每次向伺服器傳送訊息時,都需要建立一個新的套接字。
1、python3建立TCP伺服器和客戶端
- 事件包括訊息的傳送和接收。事實上,類定義只包括一個用來接收客戶端訊息的事件處理程式。所有其他的功能都來自使用的SocketServer類。
- 最後一行程式碼通常是一個伺服器的無限迴圈,它等待並響應客戶端的服務請求。
1、建立SocketServer TCP伺服器
###python3.8 #!/usr/bin/env python from socketserver import (TCPServer as TCP, StreamRequestHandler as SRH) from time import ctime HOST = '' PORT = 21567 ADDR = (HOST, PORT) class MyRequesHandler(SRH): def handle(self): self.data = str(self.request.recv(1024).strip(),'utf8') print('...connected from:',self.client_address) print(self.data) self.request.sendall(bytes('%s %s' % (self.data,ctime()),'utf8')) tcpServ = TCP(ADDR, MyRequesHandler) print('waiting for connection...') tcpServ.serve_forever()
2、建立SocketServer TCP客戶端
###python3.8 # !/usr/bin/env python from socket import * HOST = 'localhost' PORT = 21567 BUFSIZ = 1024 ADDR = (HOST, PORT) while True: tcpClisock = socket(AF_INET, SOCK_STREAM) tcpClisock.connect(ADDR) data = input('> ') if not data: break tcpClisock.send(bytes(data,'utf8')) data = tcpClisock.recv(BUFSIZ) if not data: break print(str(data.strip(),'utf8')) tcpClisock.close()
2、python2建立TCP伺服器和客戶端
1、建立SocketServer TCP伺服器
###python2.7 #!/usr/bin/env python from SocketServer import (TCPServer as TCP, StreamRequestHandler as SRH) from time import ctime HOST = '' PORT = 21567 ADDR = (HOST, PORT) class MyRequesHandler(SRH): def handle(self): print '...connected from:',self.client_address self.wfile.write('[%s] %s' % (ctime(), self.rfile.readline())) tcpServ = TCP(ADDR, MyRequesHandler) print 'waiting for connection...' tcpServ.serve_forever()
2、建立SocketServer TCP客戶端
###python2.7 # !/usr/bin/env python from socket import * HOST = 'localhost' PORT = 21567 BUFSIZ = 1024 ADDR = (HOST, PORT) while True: tcpClisock = socket(AF_INET, SOCK_STREAM) tcpClisock.connect(ADDR) data = raw_input('> ') if not data: break tcpClisock.send('%s\r\n' % data) data = tcpClisock.recv(BUFSIZ) if not data: break print data.strip() tcpClisock.close()