python之 socketserver模組的使用
阿新 • • 發佈:2018-12-28
在我們正常的使用socket模組來寫一個server的程式就會顯得比較的複雜通常一般流程為
1.生成socket例項物件
2.繫結地址
3.開始監聽
4.接收資料
一般demo為
# 伺服器 import socket server = socket.socket() # 宣告socket型別,同時生成socket連線物件 server.bind(('localhost', 6969)) # 繫結要監聽的埠此時繫結的是本地 server.listen() # 監聽 括號裡面的就是最大允許連結 print('等待電話打進來') coon, addr= server.accept() # 等待 (此時上面加一個while 就可以多個電話打進來並且進行通話) # coon 就是客戶端連過來而在伺服器端為其生成的一個連線例項 # addr 就是地址 print('電話打進來了') print(coon, addr) # 將coon 與addr 顯示出來 while True: # 此時就可以一直不停的傳送資料了, 此時的效果就是一個電話可以無阻礙的通話 # 如果此時沒有true的話就只能接收一次了 data = coon.recv(1024) # 接收資料 print('recv:', data.decode()) #此時注意我們需要吧接收的資料解碼,因為發過來的是byte型別 coon.send(data.upper()) # 將資料裡面的字母轉化為大寫傳送 server.close()
這就是一個單個接入,多次接收的server
如果想用多個接入多個接收的話我們只需要在coon上加一個while即可 ,對與server來說一個coon就是喲個接入點
那麼我們的socketserver又是方便在何處呢
對於socketserver來說我們只需要修改頭節點就可以了
我們需要新建立一個類在類裡面修改 socketserver . BaseRequestHandler即可
在這個類中hand結束即代表 當前連線斷開
import socketserver class My_TCPhandler(socketserver.BaseRequestHandler): def handle(self): while True: try: self.data = self.request.recv(1024) print("{} wrote:".format(self.client_address[0])) print(self.data) self.request.send(self.data.upper()) # 伺服器端到此結束 except ConnectionResetError as e: print(e) break HOST, POST = "localhost", 9999 server = socketserver.ThreadingTCPServer((HOST, POST), My_TCPhandler) # 併發 TCPServer改成 ThreadingTCPServer 在Linux是建議使用Forking來開多執行緒 server.serve_forever()
當
server = socketserver.ThreadingTCPServer((HOST, POST), My_TCPhandler) 時就是開了多執行緒可以多個接入,多個實時接收與傳送
這樣來看我們的的伺服器端的程式是不是便捷了呢?