1. 程式人生 > >python之 socketserver模組的使用

python之 socketserver模組的使用

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