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())  #先发送本次结果数据大小给客户端验证
        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)
    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 @ 2020-02-20 10:43  王亚博客  阅读(186)  评论(0编辑  收藏  举报