socket tcp/ip 之簡單ssh協議
阿新 • • 發佈:2018-02-13
圖片 ssa 都是 服務端 bubuko tro cmd wait 分享
看了python核心編程和大牛的視頻之後,自己動手也試了一試,寫寫筆記,加深一下印象
首先服務端要導入socket模塊,然後綁定地址和端口,並監聽,然後進入等待接收來自客戶端請求的一個循環,如果有數據來連接,則接收數據,整理後把請求的數據發給客戶端。
客戶端則也是導入socket模塊,連接地址和端口,然後是一個發送請求的循環,然後接收來自服務器的信息。
所有的數據的發送與接收都是采用字節類型,而不是字符串,所以要用encode編碼。
實現計算機內部命令的接收與發送,如果輸入的命令有誤,則給出提示。
服務器端:
import socket, os #導入模塊 tcp_ser = socket.socket() tcp_ser.bind((‘localhost‘, 6666))#綁定端口和IP tcp_ser.listen(5)#監聽數目 while True:#大循環,客戶端掛掉服務端一直監聽狀態 conn, addr = tcp_ser.accept()#等待連接 print(‘waitting connect...‘, addr) while True:#小循環,一個客戶端的多個請求 data = conn.recv(1024)#允許一次接收的數據為1K #if not data:#在客戶端已經判斷,可以不要 # conn.send(b‘please input command!‘)# continue cmd_data = os.popen(data.decode(‘utf-8‘)).read()#調取讀取計算機內部命令 if not cmd_data:#做個判斷,如果讀取為空,即沒有返回信息,則輸入命令有誤,則發送特定信息,並重新請求 conn.send(b‘No command!‘) continue conn.send(cmd_data.encode(‘utf-8‘))#如果命令正確則發送返回的數據 #conn.close()tcp_ser.close()
客戶端:
import socket tcp_client = socket.socket() tcp_client.connect((‘localhost‘, 6666))#客戶端應該與服務器端一致 while True:#客戶端的循環 data = input(‘>>‘)#判斷輸入是否為空,若為空則不允許發送 if len(data) == 0: print(‘No input message...‘) continue tcp_client.send(data.encode(‘utf-8‘))#發送請求數據 cmd_msg = tcp_client.recv(102400)#接收返回數據,一次性接收102k print(cmd_msg.decode(‘utf-8‘))#接收和發送都是以字節的形式,所以要編碼encode,打印需要解碼decode tcp_client.close()
成功實現:
socket tcp/ip 之簡單ssh協議