python網絡編程之socketserver,在進行網絡編程前我們先來說說在網絡中服務器與客戶端是如何交互的,也就是傳說中的TCP三次握手。
三次握手的目的是為了確認客戶端與服務端都能接收到對方的信息,以下是三次握手的詳細過程:
第一次握手:客戶端給服務端發送請求包
此時服務端確認自己可以接收到客戶端的請求包
客戶端無法確認服務端是否接收到了自己發的請求包
第二次握手:服務端回復客戶端
此時客戶端確認自己發的請求包已被服務端收到,也確認自己可以正常接收服務端發來的包
服務端可以確認自己能接收到客戶端的包,但不能確認客戶端是否能收到自己發送的包
第三次握手:客戶端回復服務端
此時客戶端已無疑問
服務端也確認剛剛客戶端收到了自己的回復包。兩邊都沒問題了,開始通信
在python中提供了兩個socket編程模塊,分別是socket和socketserver。
我們先來說說socket編程需要經歷哪些步驟:
客戶端:
1、創建socket客戶端連接對象
2、通過連接對象的connect()方法連接服務端
3、通過連接對象的send()方法給服務端發送信息或指令
4、通過連接對象的recv()方法接收服務端的返回信息
5、通過連接對象的close()方法斷開連接 服務端:
1、創建socket服務端連接對象
2、通過連接對象的bind()方法綁定要監聽的IP與端口
3、通過連接對象的listen()方法來監聽
4、通過連接對象的accept()方法創建與客戶端交互的子連接對象并等待客戶端連接
5、接收并處理客戶端的請求
6、將處理結果返回給客戶端
由于socket無法支持多用戶,多并發。于是就有了socketserver
socketserver最主要的作用就是實現并發處理。
socketserver有以下幾種類型:
TCPServer:tcp協議
classsocketserver.TCPServer(server_address,RequestHandlerClass,bind_and_activate=True)
ThreadingTCPServer:多線程,多并發的TCPServer
classsocketserver.ThreadingTCPServer(server_address,RequestHandlerClass,bind_and_activate=True)
ForkingTCPServer:多進程,多并發的TCPServer #在windows中不能使用這個
classsocketserver.ForkingTCPServer(server_address,RequestHandlerClass,bind_and_activate=True)
UDPServer:udp協議
classsocketserver.UDPServer(server_address,RequestHandlerClass,bind_and_activate=True)
UnixStreamServer:tcp協議,Unix本機間不同進程間通信可以使用這個server
classsocketserver.UnixStreamServer(server_address,RequestHandlerClass,bind_and_activate=True)
UnixDatagramServer:udp協議,Unix本機間不同進程間通信可以使用這個server
classsocketserver.UnixDatagramServer(server_address,RequestHandlerClass,bind_and_activate=True)
BaseServer是所有Server類型的基類。
TCPServer繼承了BaseServer,UnixStreamServer繼承了TCPServer。
UDPServer繼承了TCPServer,UnixDatagramServer繼承了UDPServer。
BaseServer有以下這些方法:
fileno():返回文件描述符
handle_request():處理單個請求
serve_forever(poll_interval=0.5):處理多個請求
poll_interval用來設置多長時間檢查一下是否有收到shutdown()請求
當收到shutdown()請求后,調用service_actions(),serve_forever將停止提供服務
shutdown():告訴serve_forever()讓其停掉
server_close():關閉服務
創建socketserver的步驟:
1、創建一個BaseRequestHandlerclass的子類并在子類中重寫handle()方法
這個子類用來處理客戶端的請求
與客戶端所有的交互都是在handle()方法中編寫
2、實例化一個server(如TCPServer)類,并且將Server_IP和上一步創建的子類傳給這個實例化的類(此處是 TCPServer)作為參數
3、調用第2步實例化出來的對象的方法,這里假定這個實例化出來的對象為server:
server.handle_request():只處理一個請求,處理完后退出
server.serve_forever():處理多個請求,永遠執行
4、調用close()方法關閉server
重寫BaseRequestHandlerclass類的handle()方法:
defhandle(self):#self.requestistheTCPsocketconnectedtotheclientself.data=self.request.recv(1024).strip()print("{}wrote:".format(self.client_address[0]))print(self.data)#justsendbackthesamedata,butupper-casedself.request.sendall(self.data.upper())#sendall其實就是重復調用send,在這里也可以用send
看文倉www.kanwencang.com網友整理上傳,為您提供最全的知識大全,期待您的分享,轉載請注明出處。
歡迎轉載:http://www.kanwencang.com/bangong/20170209/99836.html
文章列表