簡(jiǎn)介
SocketServer是python的一個(gè)網(wǎng)絡(luò)服務(wù)器框架箕别,可以減少開(kāi)發(fā)人員編寫(xiě)網(wǎng)絡(luò)服務(wù)器程序的工作量俄周。
SocketServer總共有4個(gè)server基類(lèi)亡电。
TCPServer:負(fù)責(zé)處理TCP協(xié)議沪铭。
UDPServer:負(fù)責(zé)處理UDP協(xié)議壮池。
UnixStreamServer:只適用于類(lèi)unix平臺(tái),不常用杀怠。
UnixDatagramServer:只適用于類(lèi)unix平臺(tái)火窒,不常用。
這4個(gè)類(lèi)會(huì)同步處理每一個(gè)request驮肉,也就是說(shuō)只有當(dāng)前的request處理完才會(huì)處理下一個(gè)request熏矿,這種方式顯然很不合理,如果當(dāng)前的request處理過(guò)慢的話(huà)就會(huì)導(dǎo)致“堵塞”。正確的處理方式應(yīng)該是開(kāi)辟新的進(jìn)程或線(xiàn)程去處理不同的request票编,通過(guò)混合繼承ForkingMixIn或ThreadingMixIn類(lèi)即可解決此問(wèn)題褪储。
創(chuàng)建socketserver
- First, you must create a request handler class by subclassing the BaseRequestHandlerclass and overriding its handle() method; this method will process incoming requests.
- Second, you must instantiate one of the server classes, passing it the server’s address and the request handler class.
- Then call the handle_request() or serve_forever() method of the server object to process one or many requests.
- Finally, call server_close() to close the socket.
import socketserver
class MyTCPHandle( socketserver.BaseRequestHandler ): #創(chuàng)建一個(gè)繼承自 SocketServer.BaseRequestHandler 的類(lèi),并重構(gòu)handle方法
def handle(self):
while True:
try:
self.data = self.request.recv(1024).decode()
self.request.send(self.data.upper().encode())
except ConnectionResetError as e:
print("ConnectResetError:", e)
break
finally:
print("ok")
if __name__ == '__main__':
#server = socketserver.TCPServer(('localhost', 6969), MyTCPHandle) #單線(xiàn)程
server = socketserver.ThreadingTCPServer(('localhost', 6969), MyTCPHandle) #多線(xiàn)程
#server = socketserver.ForkingTCPServer(('localhost', 6969), MyTCPHandle) #多進(jìn)程,windows不可用
server.serve_forever()
socketserver使用異常處理客戶(hù)端斷開(kāi)的情況
ftp的高級(jí)版本:https://github.com/jinboxu/ftp_advanced