基于Socket写一个ssh通讯,并且完美解决粘包问题
linux-dash
A beautiful web dashboard for Linux
项目地址:https://gitcode.com/gh_mirrors/li/linux-dash
免费下载资源
·
注意:本例所有代码均在windows平台下实现,如果是Linux或者Mac os下可能会存在诧异并产生一定问题。
因此:如果需要测试请在windows平台下进行。
首先来看客户端实现代码:
import socket
client = socket.socket()
client.connect(('localhost',9999))
while True:
msg = input('>>:').strip()
if len(msg) == 0: continue
client.send(msg.encode('utf-8'))
data_rev_size = client.recv(1024) #接收命令的大小
print(data_rev_size)
client.send('已经准备好接收数据了。'.encode('utf-8'))
re_size = 0
re_data = b''
while re_size != int(data_rev_size.decode()):
data_rev = client.recv(1024)
re_size += len(data_rev)
print(re_size)
re_data += data_rev
print(re_data.decode())
client.close()
然后再来看服务端代码:
import socket
import os
import time
server = socket.socket()
server.bind(('localhost',9999))
server.listen(5)
while True:
con,addr = server.accept()
while True:
try:
data = con.recv(10240) # 接收数据
cmd_res = os.popen(data.decode()).read()
# print(cmd_res)
if len(cmd_res) == 0:
cmd_res = 'This commit is not recve'
con.send(str(len(cmd_res.encode('utf-8'))).encode('utf-8')) #先大大小给客户端
# time.sleep(0.5) #这个是为了避免数据粘包的情况,直接等待0.5s
# 使得它超时,然后直接执行下一条命令
# 但正常不能这样
sure = con.recv(1024) #最新的解决粘包的问题
print(sure.decode())
con.send(str(cmd_res).encode('utf-8')) #再把命令返回给客户端
except ConnectionResetError as e:
print('客户端已经断开!')
break
con.close()
server.close()
这里测试的话,请先运行服务端代码,然后运行客户端代码,
然后输入windows命令进行测试,如dir、ipconfig、pwd等
GitHub 加速计划 / li / linux-dash
10.39 K
1.2 K
下载
A beautiful web dashboard for Linux
最近提交(Master分支:2 个月前 )
186a802e
added ecosystem file for PM2 4 年前
5def40a3
Add host customization support for the NodeJS version 4 年前
更多推荐
已为社区贡献7条内容
所有评论(0)