socketserver簡化了網路伺服器的編寫。在進行socket建立時,使用socketserver會大大減少建立的步驟,並且socketserver使用了select它有5個類:baseserver,tcpserver,udpserver,unixstreamserver,unixdatagramserver。後4個類是同步進行處理的,另外通過forkingmixin和threadingmixin類來支援非同步。
socketserver的5個類的繼承關係
socketserver內部使用 io多路復用 以及 「多執行緒」 和 「多程序」 ,從而實現併發處理多個客戶端請求的socket服務端。即:每個客戶端請求連線到伺服器時,socket服務端都會在伺服器是建立乙個「執行緒」或者「進 程」 專門負責處理當前客戶端的所有請求。
一是server類:baseserver/tcpserver/udpserver用來接收客戶的請求。tcpserver處理tcp請求,udpserver處理udp請求。baserserver是基類,不能直接使用。tcpserver繼承自baseserver,udpserver繼承自tcpserver。
二是handler類:baserequesthandler/datagramrequesthandler/streamrequesthandler用來處理每乙個客戶請求。一般用使用baserequesthandler就行,但streamrequesthandler/datagramrequesthandler提供了一些特別的功能,前者用來處理流式(tcp)請求,後者處理資料報(udp)請求。server每收到乙個客戶請求就會建立乙個handler類示例來處理該請求。預設情況下,tcpserver/udpserver是單程序單執行緒的模型,依次處理每個客戶請求,乙個請求處理完畢才能接著處理下乙個請求。
三是mixin類:forkingmixin/threadingmixin用來為server提供多程序/多執行緒併發處理能力的。forkingmixin是多程序模型,threadingmixin是多執行緒模型。這裡特別巧妙的是,你只要建立乙個類,同時繼承server類和mixin類就能自動獲得併發處理請求的能力。該模組本身就直接提供了這種類。
class forkingudpserver(forkingmixin, udpserver): passserver.handle_request() 只處理乙個請求class forkingtcpserver(forkingmixin, tcpserver): pass
class threadingudpserver(threadingmixin, udpserver): pass
class threadingtcpserver(threadingmixin, tcpserver): pass三
server.forever() 處理多個請求,一直執行
簡單的接收客戶端傳送的資訊,並將其轉換成大寫,再返回給客戶端
服務端:
# -*- coding: utf-8 -*-客戶端:import socketserver
class mytcphandler(socketserver.baserequesthandler):
"""the request handler class for our server.
it is instantiated once per connection to the server, and must
override the handle() method to implement communication to the
client.
"""def handle(self):
while true: # 多次接收客戶端資訊
# self.request is the tcp socket connected to the client
self.data = self.request.recv(1024).strip()
print("{} wrote:".format(self.client_address[0]))
print(self.data)
# just send back the same data, but upper-cased
self.request.sendall(self.data.upper())
if __name__ == "__main__":
host, port = "localhost", 9999
# create the server, binding to localhost on port 9999
server = socketserver.tcpserver((host, port), mytcphandler)
# activate the server; this will keep running until you
# interrupt the program with ctrl-c
server.serve_forever()
# -*- coding: utf-8 -*-到目前為止我們所有的c/s連線都同時只能處理乙個客戶端請求,多個客戶端請求時,要等前面的客戶端請求關閉後才能執行,包括上面的**也是。如果想讓socketserver併發起來, 必須選擇使用以下乙個多併發的類:import socket
client = socket.socket()
client.connect(('localhost', 9999))
while true:
msg = input('>>:').strip()
if not msg:
continue
else:
client.send(msg.encode('utf-8'))
updata = client.recv(1024)
print(updata.decode())
class socketserver.forkingtcpserver只需要改變乙個地方就可以了class socketserver.forkingudpserver
class socketserver.threadingtcpserver
class socketserver.threadingudpserver
server = socketserver.tcpserver((host, port), mytcphandler)服務端:
import socketserverclass mytcphandler(socketserver.baserequesthandler):
def handle(self):
while true:
# self.request is the tcp socket connected to the client
self.data = self.request.recv(1024).strip()
print("{} wrote:".format(self.client_address[0]))
print(self.data)
# just send back the same data, but upper-cased
self.request.sendall(self.data.upper())
if __name__ == "__main__":
host, port = "localhost", 9999
server = socketserver.threadingtcpserver((host, port), mytcphandler)
server.serve_forever()
執行緒池版的SocketServer
python的socketserver模組提供了乙個開發socket server的捷徑。但是其自帶的非同步handler threadingmixin每次處理請求是都會產生乙個新的執行緒,在負載較重的時候會有一些問題。需要乙個使用執行緒池的tcpserver.具體的 如下 繼承自tcpserver...
執行緒池版的SocketServer
python的socketserver模組提供了乙個開發socket server的捷徑。但是其自帶的非同步handler threadingmixin每次處理請求是都會產生乙個新的執行緒,在負載較重的時候會有一些問題。需要乙個使用執行緒池的tcpserver.具體的 如下 from threadi...
多執行緒 多執行緒原理
我們首先要知道什麼是多執行緒,說白了就是多個執行緒,執行緒是什麼呢,其實就是程序執行的途徑,那麼說道這裡我們又引入了乙個新的名字,就是程序,那麼我們來看看什麼是程序,其實我們自己也能看到,啟動電腦的任務管理器,我們就可以看到程序選項,裡面是我們電腦所有的程序,我們會發現有很多的程序.簡單地說就是程序...