码迷,mamicode.com
首页 > 编程语言 > 详细

python——简易的cmd码交互

时间:2019-09-09 22:41:06      阅读:125      评论:0      收藏:0      [点我收藏+]

标签:roc   接收   gbk   time模块   data   import   col   休眠   l命令   

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(客户已离开)
            break
        if not data:break
        print(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()
"""""

"""

 

python——简易的cmd码交互

标签:roc   接收   gbk   time模块   data   import   col   休眠   l命令   

原文地址:https://www.cnblogs.com/zzzi/p/11494539.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!