server端发送命令,client端执行

server

 

import socket
import subprocess
ip_port = ('127.0.0.1',8879)
sk = socket.socket()
sk.bind(ip_port)
sk.listen(5)
print ("服务端启动...")
while True:
    conn,address = sk.accept()
    while True:
        try:

            client_data=conn.recv(1024)
        except Exception:
            break
        print (str(client_data,"utf8"))
        print ("waiting...")
        # server_response=input(">>>")
        # conn.sendall(bytes(server_response,"utf8"))
        cmd=str(client_data,"utf8").strip()
        cmd_call=subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE)
        cmd_result=cmd_call.stdout.read()
        if len(cmd_result)==0:
            cmd_result=b"no output!"
        result_len=bytes(str(len(cmd_result)),'utf8') #默认len是int类型。int无法直接转换成bytes类型
        conn.sendall(result_len)#粘包现象。
conn.recv(1024) #解决粘包 conn.sendall(cmd_result)
print('send data size',len(cmd_result)) print('******************') print('******************') print('******************') conn.close()

client端

import socket
ip_port = ('127.0.0.1',8879)
sk = socket.socket()
sk.connect(ip_port)
print ("客户端启动:")
while True:
    inp = input('cdm:>>>').strip( )
    if len(inp)==0:
        continue
    if inp=="q":
        break
    sk.sendall(bytes(inp,"utf8"))
    result_len = int(str(sk.recv(1024),'utf8'))
sk.send('111') #做一个隔断,防止粘包
print(result_len) data=bytes() while len(data) != result_len: server_response=sk.recv(1024) #这里接收server端cmd_result,windows shell 默认使用gbk,所以下班要用gbk解码 data+=server_response print (str(data,"gbk")) #接收需要gbk解码 print('receive data size',len(server_response)) if inp == 'exit': break sk.close()

 

posted @ 2018-06-05 13:45  cornerxin  阅读(418)  评论(0)    收藏  举报