標籤:
這兩天,學習了python的通訊端編程(linux版),我發現好多的資料都是linux的,然而python這個利器顯然是跨平台的,所以,我根據linux版的資料來寫一點windows的東西,希望對大家有點協助,另外:本人小菜菜一枚,要是哪裡有問題,歡迎指正,謝謝合作。
首先分析一下大概過程:
一、建立串連後,(多個或者一個)用戶端將命令列發給伺服器;
二、伺服器收到命令列後,執行命令;
三、伺服器將執行的結果反饋給用戶端;
四、多次執行上述過程;
那麼,python是怎麼解決這幾個問題的呢?
一、串連部分,由於伺服器端需要同時處理多個用戶端的請求,所以需要用到多線程的並行作業,python提供SocketServer來解決伺服器多線程問題,對於用戶端,用python提供的單線程socket就可以進行收發資料了;
二、執行發過來的命令,python提供了一個os這個模組來解決(linux使用commads模組),具體來說,由於我們需要將返回的資料發回用戶端,所以需要使用cmd_result = os.popen("命令").read()。
三、由第二點可知:顯然,我們需要返回用戶端的是cmd_result。
四、要多次執行,可以使用python的迴圈來執行;
註:大概過程以及python解決方案已經分析完了,但是,對於程式的細節,比如,使用sendall()可以一次發送所有資料,要是使用send()可能需要對資料的迴圈發送;再比如,對資料判空語句,以及python的文法,這裡筆者就不囉嗦了,要是有疑問,歡迎留言討論,或者自行百度解決,下面是代碼:
伺服器:
#serverimport SocketServer, osclass MyTCPHandler(SocketServer.BaseRequestHandler): def handle(self): while True: self.data = self.request.recv(1024).strip() print "{}wrote:".format(self.client_address[0]) if not self.data: print "clilent %s is dead!" % self.client_address[0] break cmd_result = os.popen(self.data).read(); if len(cmd_result.strip()) != 0: self.request.sendall(cmd_result) else: self.request.sendall('Not found the command:' + self.data)if __name__ == "__main__": HOST, PORT = "127.0.0.1", 3333 server = SocketServer.ThreadingTCPServer((HOST, PORT), MyTCPHandler) server.serve_forever()
用戶端:
#clientimport socketHOST = "127.0.0.1"PORT = 3333s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)s.connect((HOST, PORT))while 1: cmd = raw_input('Your command:').strip() s.sendall(cmd) result = s.recv(1024) print results.close()
windows下,python基於SocketServer類比實現SSH(多線程版)