socket编程执行远程命令实现_python

一、单客户端连接的例子:

服务端:

import socket,os,subprocess
server=socket.socket()
server.bind(('localhost',1234)) #绑定端口
server.listen() #监听
while True:
    print('等电话打进来')
    conn,addr=server.accept() #等电话打进来,返回值就是连接对象实例,和客户端地址
    while True:
        data=conn.recv(1024)
        print(data)
        if not data: #客户端是否断开连接判断
            print('已断开连接')
            break
        #a=subprocess.Popen(data.decode('utf-8'),shell=True,stdout=subprocess.PIPE)
        #res=a.stdout.read()#第二种执行命令返回结果的方法
        res=os.popen(data.decode('utf-8')).read() #执行命令返回结果
        print('res',res)  #因为中文的原因,windows上的接收大小与源文件大小不一样需要提前encode
        if len(res)==0:
            res='cmd has no output'
        data_len=len(res.encode())  #这里需要先encode(),然后再计算大小,不然与客户端计算大小方式有出入
        print(data_len)
        conn.send(str(data_len).encode())  #先发送本次结果数据大小给客户端验证

        client_ack=conn.recv(1024)#两次数据发送不要在一起,防止出现粘包现象
        conn.sendall(res.encode()) #相当于循环发送完整结果

 

客户端:

import socket
client=socket.socket() #声明socket类型,生成对象
client.connect(('localhost',1234))
while True:
    msg=input('>>')
    if len(msg)==0:continue
    client.send(msg.encode('utf-8'))  #只能发送bytes类型
    data_len=client.recv(1024)
    print(data_len)
    client.send(b'ready!!') #防止粘包的回应
    receive_len=0
    while int(data_len.decode())>receive_len:  #循环完整接收本次命令的结果
        data=client.recv(10240)
        receive_len=receive_len+len(data)
    print(receive_len)
    print(str(data,'utf-8'))

client.close()

 

posted on 2020-02-20 10:33  陈小赞  阅读(305)  评论(0编辑  收藏  举报

导航