1. 程式人生 > >《python核心程式設計》讀書筆記-socketserver模組

《python核心程式設計》讀書筆記-socketserver模組

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)