cmd_server
import
socket
import subprocess#可执行shell命令
sk=socket.socket()
address=(‘127.0.0.1‘,8000)
sk.bind(address)
sk.listen(3)
print(‘waiting...‘)
while 1:
conn,addr=sk.accept()
while 1:
try:
data=conn.recv(1024)#数据过大 会导致接收不完全except Exception as e:
print(‘客户已离开‘)
breakifnot data:breakprint(str(data,‘utf-8‘))
obj=subprocess.Popen(str(data,‘utf-8‘),shell=True,stdout=subprocess.PIPE)
#stdout为标准输出 PIPE为管道 作用为将进程转为主进程 (封装了)#若不加最后一句 无法将其取到 赋值在变量上
cmd_result=obj.stdout.read()
result_len=bytes(str(len(cmd_result)),‘utf-8‘)
# int类型不能直接转为bytes 需要通过str来中间过渡 conn.sendall(result_len)
conn.recv(1024)#用于隔断 conn.sendall(cmd_result)
sk.close()
"""""
client端发送一个指令 然后server端将结果进行返回
解决问题:若传输的命令结果过大,要多次接收,导致下一个命令无法执行
解决方法:利用len函数对传输的结果进行长度判断,之后传输给client端
再由client进行while循环判断
需要注意的:1.传输只会传bytes类,同时int无法直接转为bytes 所以需要用str进行过度
2.两个send在一起有可能会粘包,所以需要一个隔断 若用time模块 time.sleep()进行休眠的话 会拖延进程
所以再加任意‘ 收与发‘就好
"""
cmd_clinet:
import
socket
address=(‘127.0.0.1‘,8000)
sk=socket.socket()
sk.connect(address)
while True:
a=input(">>>")
if a==‘exit‘:
break
sk.send(bytes(a,‘utf-8‘))
recv_len=int(str(sk.recv(1024),‘utf-8‘))
sk.send(‘ok‘)#用于隔断print(recv_len)
data=bytes()
while len(data)!=recv_len:
recv=sk.recv(1024)
data+=recv
print(str(data,‘gbk‘))
sk.close()
"""""
"""
原文:https://www.cnblogs.com/zzzi/p/11494539.html
【说明】:本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!