socket編程模擬linux下的ssh代碼實現
阿新 • • 發佈:2017-12-26
服務端 tro class 思路 cmd 發送 無法 color message
實現思路:
1.提供輸入指令的客戶端;
2.提供返回執行指令結果的服務端
3.尋找服務端返回結果一次無法全部接收的解決思路
服務端代碼(ssh_server.py)
1 #coding=utf-8 2 import socket,os 3 4 server = socket.socket() 5 server.bind((‘localhost‘, 9999)) 6 server.listen() 7 client,addr = server.accept() 8 while True: 9 data = client.recv(1024) 10 if data == ‘‘or data == None:continue 11 cmd_res = os.popen(data.decode()).read() 12 if len(cmd_res) == 0: 13 cmd_res = ‘指令無效,請重新輸入‘ 14 client.send(str(len(cmd_res.encode(‘utf-8‘))).encode(‘utf-8‘)) 15 client.recv(1024)#更改後 16 client.send(cmd_res.encode(‘utf-8‘)) 17 print(len(cmd_res))18 server.close()
客戶端代碼(ssh_client.py)
1 # coding = utf-8 2 import socket 3 4 client = socket.socket() 5 client.connect((‘localhost‘,9999)) 6 while True: 7 cmd = input(‘>>:‘).strip() 8 if len(cmd) == 0:continue 9 client.send(cmd.encode(‘utf-8‘)) 10 data_size = int(client.recv(1024).decode())11 print(data_size) #字節大小 12 curr_size = 0 13 final_res = b‘‘ 14 while data_size != curr_size: 15 data = client.recv(1024) 16 curr_size += len(data) 17 print(curr_size) 18 final_res+=data 19 print(final_res.decode())
潛在問題:
由於服務器兩次發送的數據間歇時間太短,容易造成粘包(服務器發送出的兩條信息同時到緩存中,緩存區未滿或未超時時內部機制是知道緩存區滿才將消息拿出來,多次發送的信息資料由於此種機制的制約
很容易造成粘包,解決思路a.服務器兩次發送信息中間加一個是時間間隙,time.sleep(2);b.服務端發出上一條信息後客戶端接受到消息後向服務器返回一個標識,服務端接受到該標識後再發送第二波消息)
改進後代碼(ssh_server.py):
#coding=utf-8
import socket,os
server = socket.socket()
server.bind((‘localhost‘, 9999))
server.listen()
client,addr = server.accept()
while True:
data = client.recv(1024)
if data == ‘‘ or data == None:continue
cmd_res = os.popen(data.decode()).read()
if len(cmd_res) == 0:
cmd_res = ‘指令無效,請重新輸入‘
client.send(str(len(cmd_res.encode(‘utf-8‘))).encode(‘utf-8‘))
client.recv(1024)#b方式更改後
client.send(cmd_res.encode(‘utf-8‘))
print(len(cmd_res))
server.close()
改進後代碼(ssh_client.py)
# coding = utf-8
import socket
client = socket.socket()
client.connect((‘localhost‘,9999))
while True:
cmd = input(‘>>:‘).strip()
if len(cmd) == 0:continue
client.send(cmd.encode(‘utf-8‘))
data_size = int(client.recv(1024).decode())
client.send("received the message...")#b方式更改後
print(data_size) #字節大小
curr_size = 0
final_res = b‘‘
while data_size != curr_size:
data = client.recv(1024)
curr_size += len(data)
print(curr_size)
final_res+=data
print(final_res.decode())
socket編程模擬linux下的ssh代碼實現