在我們正常的使用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) 時就是開了多線程可以多個接入,多個實時接收與發送
這樣來看我們的的服務器端的程序是不是便捷了呢?