zoukankan      html  css  js  c++  java
  • python3 socket远程执行代码

     1 import socket
     2 import struct
     3 import json
     4 import subprocess
     5 phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #买手机
     6 phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) #就是它,在bind前加
     7 phone.bind(('127.0.0.1',8080)) #插入卡
     8 phone.listen(5) #开机
     9 while True: #链接循环
    10     conn,addr=phone.accept()
    11     print('client :',addr)
    12     while True: #通讯循环
    13         try:
    14             cmd=conn.recv(1024)
    15             if not cmd:break #针对linux,客户端断开链接的异常处理
    16             print('from client msg :%s' %cmd)
    17 
    18             res=subprocess.Popen(cmd.decode('utf-8'),
    19                              shell=True,
    20                              stdout=subprocess.PIPE,
    21                              stderr=subprocess.PIPE)
    22 
    23             err=res.stderr.read()
    24             if err:
    25                 back_msg=err
    26             else:
    27                 back_msg=res.stdout.read()
    28             #第一阶段:制作报头
    29             head_dic={
    30                 'data_size':len(back_msg)
    31             }
    32             head_json=json.dumps(head_dic)
    33             head_bytes=head_json.encode('utf-8')
    34 
    35             #第二阶段:发送报头的长度
    36             conn.send(struct.pack('i',len(head_bytes)))
    37 
    38             #第三阶段:发报头
    39             conn.send(head_bytes)
    40             #第四阶段:发真实数据
    41             conn.sendall(back_msg)
    42 
    43 
    44         except Exception:
    45             break
    46     conn.close()
    47 phone.close()
    server
     1 import socket
     2 import struct
     3 import json
     4 client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
     5 client.connect(('127.0.0.1',8080))
     6 
     7 while True:
     8     cmd=input('>>: ').strip()
     9     if not cmd:continue
    10 
    11     client.send(cmd.encode('utf-8'))
    12 
    13     #收报头的长度
    14     head=client.recv(4)
    15     head_size=struct.unpack('i',head)[0]
    16 
    17     #收报头(根据报头长度)
    18     head_bytes=client.recv(head_size)
    19     head_json=head_bytes.decode('utf-8')
    20     head_dic=json.loads(head_json)
    21     '''
    22       head_dic={
    23                 'data_size':len(back_msg)
    24             }
    25     '''
    26     data_size=head_dic['data_size'] #取出真实数据的长度
    27 
    28     #收真实的数据
    29     recv_size=0
    30     recv_bytes=b''
    31     while recv_size < data_size:
    32         res=client.recv(1024)
    33         recv_bytes+=res
    34         recv_size+=len(res)
    35     print(recv_bytes.decode('gbk'))
    client
  • 相关阅读:
    Oracle的分区打点
    学习Struts2经验总结
    优化MVC,实现数据库表的记录的添加、删除、修改、查询。
    基于struts研究传值问题
    基于“MVC”框架集设计模式,开发用户管理系统!
    使用Struts,实现简单的登录
    QT学习4:使用窗口部件
    QT学习9:绘制函数
    QT学习8:准备战斗
    QT学习6:组装丰富的积木!
  • 原文地址:https://www.cnblogs.com/xp1005/p/6529896.html
Copyright © 2011-2022 走看看