开发文章

Python基于Socket写一个ssh通讯,并且完美解决粘包问题

Python基于Socket写一个ssh通讯,并且完美解决粘包问题,例子所有代码均在windows平台下实现,如果是Linux或者Mac os下可能会存在诧异并产生一定问题。
因此:如果需要测试请在windows平台下进行。
首先来看客户端实现代码:

复制内容到剪贴板
  1. import socket  
  2.   
  3. client = socket.socket()  
  4. client.connect(('localhost',9999))  
  5.   
  6. while True:  
  7.     msg = input('>>:').strip()  
  8.     if len(msg) == 0continue  
  9.     client.send(msg.encode('utf-8'))  
  10.     data_rev_size = client.recv(1024#接收命令的大小  
  11.     print(data_rev_size)  
  12.     client.send('已经准备好接收数据了。'.encode('utf-8'))  
  13.     re_size = 0  
  14.     re_data = b''  
  15.     while re_size != int(data_rev_size.decode()):  
  16.         data_rev = client.recv(1024)  
  17.         re_size += len(data_rev)  
  18.         print(re_size)  
  19.         re_data += data_rev  
  20.     print(re_data.decode())  
  21.   
  22. client.close()  

然后再来看服务端代码:

复制内容到剪贴板
  1. import socket  
  2. import os  
  3.   
  4. import time  
  5.   
  6. server = socket.socket()  
  7. server.bind(('localhost',9999))  
  8. server.listen(5)  
  9.   
  10. while True:  
  11.     con,addr = server.accept()  
  12.     while True:  
  13.         try:  
  14.             data = con.recv(10240)  # 接收数据  
  15.             cmd_res = os.popen(data.decode()).read()  
  16.             # print(cmd_res)  
  17.             if len(cmd_res) == 0:  
  18.                 cmd_res = 'This commit is not recve'  
  19.             con.send(str(len(cmd_res.encode('utf-8'))).encode('utf-8')) #先大大小给客户端  
  20.             # time.sleep(0.5)  #这个是为了避免数据粘包的情况,直接等待0.5s  
  21.             # 使得它超时,然后直接执行下一条命令  
  22.             # 但正常不能这样  
  23.             sure = con.recv(1024#最新的解决粘包的问题  
  24.             print(sure.decode())  
  25.             con.send(str(cmd_res).encode('utf-8')) #再把命令返回给客户端  
  26.         except ConnectionResetError as e:  
  27.             print('客户端已经断开!')  
  28.             break  
  29.     con.close()  
  30.   
  31. server.close()  

这里测试的话,请先运行服务端代码,然后运行客户端代码,
然后输入windows命令进行测试,如dir、ipconfig、pwd等

上一篇:websocket原理

下一篇:返回列表

文章信息

发布时间:2018-05-06

作者:blog.csdn.net/haeasringnar/art

发布者:aquwcw

浏览次数: