Python 之 SSH實例(可接受大字節返回)
阿新 • • 發佈:2019-03-04
pri ddr host 實例 socket listen out 新的 acc 服務器端代碼
#Author Kang import os import subprocess import socket server = socket.socket() server.bind((‘localhost‘,9999)) server.listen() print("等待客戶端連接:>>>>") while True: conn,addr = server.accept() print("接受了一個新的鏈接!!") while True: data = conn.recv(1024) cmd = subprocess.getstatusoutput(data.decode()) print("執行命令:>>",cmd) res_size = str(len(cmd[1].encode("utf-8"))) print(res_size) if len(cmd[1]) != 0: conn.send(res_size.encode("utf-8")) ack = conn.recv(1024) #解決SOCKET粘包的問題,即發送命令結果大小與命令結果同時發送 conn.send(cmd[1].encode("utf-8")) elif cmd[0] == 0 and len(cmd[1]) == 0: res = ‘命令執行成功,但沒有返回值‘ conn.send(res_size.encode("utf-8")) ack = conn.recv(1024) # 解決SOCKET粘包的問題 conn.send(res.encode("utf-8")) if len(data) == 0: break server.close()
客戶端代碼
#Author Kang import socket client = socket.socket() client.connect((‘localhost‘,9999)) while True: msg = input("請輸入你要傳遞的信息:>>>>>") if len(msg) == 0: continue client.send(msg.encode("utf-8")) #發送命令給服務器端 cmd_size = client.recv(1024) #接受服務器返回結果的長度 print("接受結果的大小為:",cmd_size.decode()) recv_size = 0 res_data = "" client.send("我已經可以可以接受了".encode("utf-8")) #為了解決粘包的問題,返回我已經接送命令返回的大小,開始接受結果 while recv_size < int(cmd_size): #判斷當前接受的大小與服務器執行命令大小,如小於繼續接受 data = client.recv(1024) recv_size += len(data) res_data += data.decode() else: print(res_data) client.close()
Python 之 SSH實例(可接受大字節返回)