《python核心程式設計》讀書筆記-socketserver模組
阿新 • • 發佈:2019-01-13
socketserver模組
SocketServer是標準庫的一個高階模組,在Python3.x改名為socketserver,用於建立網路客戶端和服務端。當使用這個模組的時候,它是以面向物件的方式處理事務,有利於組織資料,以及邏輯性的將功能放在正確的位置,你還會注意到,應用程式現在是事件驅動的,這意味著只有系統有事件發生的時,他們才會工作。
在原始伺服器迴圈中,我們阻塞等待請求,當接收到請求時,就對其提供服務,然後繼續等待,在此處的伺服器迴圈中,並非在伺服器中建立程式碼,而是定義一個處理程式,這樣當一個伺服器收到一個傳入請求的時候,伺服器就可以呼叫你的程式。
SocketServer模組類
類 | 描述 |
---|---|
BaseServer | 包含核心伺服器功能和mix-in類的鉤子,僅用於推導,這樣不會建立這個類的例項;可以用TCPServer或UDPServer建立類的例項 |
TCPServer/UDPServer | 基礎的網路同步TCP/UDP伺服器 |
UnixStreamServer/UnixDatagramServer | 基於檔案的基礎同步TCP/UDP伺服器 |
ForkingMixIn/ThreadingMixIn | 核心派出或執行緒功能;只用作mix-in類與一個伺服器類配合實現一些非同步性:不能直接例項化這個類 |
ForkingTCPServer/ForkingUDPServer | ForkingMixIn和TCPServer/UDPServer的組合 |
ThreadingTCPServer/ThreadingUDPServer | ThreadingMixIn和TCPServer/UDPServer的組合 |
BaseRequestHandler | 包含處理服務請求的核心功能;僅僅用於推導,這樣無法建立這個類的例項;可以使用StreamRequestHandler或DatagramRequestHandler建立類的例項 |
StreamRequestHandler/DatagramRequestHandler | 實現TCP/UDP伺服器的服務處理器 |
TCP服務端
程式是《python核心程式設計》的例程,但是測試例程出了一點問題,這裡做了修改貼上來記錄一下。
時間戳TCP伺服器,客戶端傳送資訊,服務端接受資訊打上時間戳並返回。
[[email protected] ~]# cat Tcp_SS_Ser.py
#!/usr/bin/env python3.4
from socketserver import (TCPServer as TCP,
StreamRequestHandler as SRH)
from time import ctime
HOST = ''
PORT = 21567
ADDR = (HOST, PORT)
class MyRequestHandler(SRH):
def handle(self):
print('...connected from:', self.client_address)
self.wfile.write(('[%s] %s' %(ctime(), self.rfile.readline().decode())).encode())
tcpServ = TCP(ADDR, MyRequestHandler)
print('waiting for connection...')
tcpServ.serve_forever()
TCP客戶端
[[email protected] ~]# cat Tcp_SS_Cli.py
#!/usr/bin/env python3.4
from socket import *
HOST = 'localhost'
PORT = 21567
BUFSIZE = 1024
ADDR = (HOST, PORT)
while True:
tcpCliSock = socket(AF_INET, SOCK_STREAM)
tcpCliSock.connect(ADDR)
data = input('> ')
if not data:
break
tcpCliSock.send(('%s\r\n' % data).encode())
data = tcpCliSock.recv(BUFSIZE).decode()
if not data:
break
print(data.strip())
tcpCliSock.close()
期間遇到的錯誤
[[email protected] ~]# ./tcp_SS.py
Traceback (most recent call last):
File "./tcp_SS.py", line 3, in <module>
from SocketServer import (TCPServer as TCP,
ImportError: No module named 'SocketServer'
原因:SocketServer模組是python2的名稱,在python已經改成socketserver了,所以吧名稱改一下就可以了
from socketserver import (TCPServer as TCP,
StreamRequestHandler as SRH)