tcp-1 cmd

一. struct 变成固定字节长度的数字

import struct #  ii 可接收两个数字参数  i 接收一个数字参数

def packI_scope(mode, num, plus):#mode="i" int固定4个字节的长度
    while True:
        try:
            num = num + plus
            p = struct.pack(mode, num)
            u = struct.unpack(mode, p)
            print(p, len(p), str(num), len(str(num)), u, u[0])
        except:
            if plus > 0:
                print("最大整数值=", num - plus,"\n")
            else:
                print("最小整数值=", num - plus,"\n")
            break

if __name__ == '__main__':
    print(-pow(2,4*8-1),pow(2,31)-1,"\n")

    packI_scope("i", num=2147483640, plus=1)
    packI_scope("i", num=-2147483640, plus=-1)

    p0 = struct.pack("i", 0)
    u0 = struct.unpack("i", p0)
    print("[0]也是四个字节=",p0, u0)
    print(5+-1,-1+5)
import struct
def structPackII(num1, num2): #int int 固定8个字节
    p = struct.pack("ii", num1, num2)
    u = struct.unpack("ii", p)
    print(p, len(p), u)

if __name__ == '__main__':
    structPackII(0, 0)
    structPackII(-2147483648, -2147483648)
    structPackII(2147483647, 2147483647)
    structPackII(2147483647, -2147483648)
    structPackII(-2147483648, 2147483647)
import struct
dataTypes = ["i", "ii", "f", "ff", "s", "ss", "d", "dd"]
for t in dataTypes:
    print("{:<2} 长度length: {}".format(t, struct.calcsize(t)))

f0=struct.pack("f",3.14)
print(struct.unpack("f",f0),len(f0))

二.hashlib md5

import hashlib
m=hashlib.md5()
m.update( "123456".encode("utf-8") )
print(m.hexdigest())
print( hashlib.md5( "123456".encode("UTF-8") ).hexdigest() )

m1=hashlib.md5( "12".encode("Utf-8") )
m1.update( "345".encode("uTF-8") )
m1.update( "6".encode("uTF-8") )
print(m1.hexdigest())  # 此处才计算 十六进制 md5值

三.subprocess.Popen

import subprocess

def cmd(command):
    obj0 = subprocess.Popen("echo %cd%", shell=True,
                            stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    present_working_directory=obj0.stdout.read().decode("gbk").strip()

    obj=subprocess.Popen(command,shell=True,
        stdout=subprocess.PIPE,stderr=subprocess.PIPE)
    cmd_res_stdout, cmd_res_stderr = obj.stdout.read(), obj.stderr.read()
    
    print("[1]",cmd_res_stdout)
    print("[2]",cmd_res_stderr)
    print("[3] {}> {}".format(present_working_directory,command))
    print(cmd_res_stdout.decode("gbk"))

if __name__ == '__main__':
    cmd("ipconfig /all")

四.json

import json,hashlib

header_dic={ "filename":"a.txt", }
header_dic.update( md5=hashlib.md5("123456".encode("utf8")).hexdigest() )
header_dic["total_size"]= len(  "123456".encode("utf8") )
print( header_dic,type(header_dic),"\t单引号=字典" )

header_json=json.dumps( header_dic )
print( header_json, type(header_json),"\t双引号=json序列化为字符串")

h_dic=json.loads(header_json)
print( h_dic, type(h_dic),"\t反序列化为字典" )

Server发送前4字节(头部长度)+发送头部+主体信息

import hashlib,json,socket,struct,subprocess # 先运行服务器a1.py程序
import multiprocessing,threading
import time

ADDR= (HOST,PORT) ="127.0.0.1",9999

class ServerTCPcmd:
    def __init__(self):
        self.server=get_tcp_server()
        print("服务器已启动..")

    def runCmd(self):
        while True:
            conn,client_addr=self.server.accept()
            print(client_addr,conn)

            #handle_client_cmd(conn) #不能同时接受客户端服务
            
            #receive_thread = threading.Thread(target=handle_client_cmd, args=(conn,))
            #receive_thread.start() # 多线程方法 多进程方法
            
            process=multiprocessing.Process(target=handle_client_cmd,args=(conn,))
            process.start() #同时接受多个客户端服务,超出最大连接数的客户端只能等待

def get_tcp_server( server_address=ADDR ):
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    server.bind( server_address )
    server.listen(5)
    return server

def handle_client_cmd(client_conn:socket.socket):
    # 指明client_conn类型 代码将有提示
    while True:
        try:
            cmd=step1_receive_client_commands(client_conn)
            if not cmd:
                break #出现情形 客户端已经断开了
            print(f"[{time.strftime('%Y-%m-%d %X')}]接收remote_client_cmd:", cmd)

            cmd_res_bytes=step2_execute_cmd(cmd)
            step3_send(cmd, cmd_res_bytes, client_conn)

        except ConnectionResetError:
            break
    client_conn.close()

def step1_receive_client_commands( conn:socket.socket ):
    cmd = conn.recv(1024).decode().strip()
    return cmd

def step2_execute_cmd(cmd:str):
    obj = subprocess.Popen(
        cmd,
        shell=True,
        stdout=subprocess.PIPE,
        stderr=subprocess.PIPE
    )
    return obj.stdout.read() + obj.stderr.read()

def step3_send(cmd:str, cmd_res_bytes:bytes, conn):
    header_dic={
        "client_cmd" : cmd,
        "cmd_res_md5" : hashlib.md5( cmd_res_bytes ).hexdigest(),
        "cmd_res_bytes_lenth" : len( cmd_res_bytes ),
    }

    header_json=json.dumps( header_dic )
    header_bytes=header_json.encode("gbk")
    header_len=struct.pack("i",len(header_bytes))

    conn.send( header_len )
    conn.send( header_bytes + cmd_res_bytes )

if __name__ == '__main__':
    ServerTCPcmd().runCmd()

Client.py

import socket, struct, json, hashlib, sys  # a2.py(pycharm 打开多个a2.py)

class ClientTCPcmd:
    def __init__(self):
        self.client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        try:
            self.client.connect( ("localhost", 9999) )
            print("连接服务器成功",self.client.getpeername(),self.client.getsockname())
        except:
            print("服务器已断开无法连接(程序将退出)")
            sys.exit()

    def CmdSend(self):
        while True:
            if self.step1_send_cmd()==-1:
                break
            self.step2_receive_server_result()
        self.client.close()

    def step1_send_cmd(self):
        print("【0】请输入WindowsCMD(输exit退出客户端程序)..")
        cmd = input(">> ").strip().encode("utf8")
        if not cmd:
            self.step1_send_cmd() #相当于循环 continue
        if cmd.decode() in ["exit", "bye", "quit"]:
            return -1
        self.client.send(cmd)
        return 0

    def step2_receive_server_result(self):
        rec_header_len = struct.unpack("i", self.client.recv(4) )[0]
        print("【1】获取服务器头部信息长度", rec_header_len)

        rec_header_bytes = self.client.recv(rec_header_len)
        rec_header_dict = json.loads( rec_header_bytes.decode("gbk") )
        print("【2】获取服务端的头部信息内容", rec_header_dict)

        recv_data_size, recv_data = 0, b""
        while recv_data_size < rec_header_dict["cmd_res_bytes_lenth"]: 
         #recv_size=数据长度 时退出循环
            res=self.client.recv(1024)
            recv_data += res
            recv_data_size += len(res)
        print("【3】获取服务器执行cmd结果的数据长度", recv_data_size, len(recv_data))

        # 4.获取服务器发来的文件名称/md5
        client_cmd=rec_header_dict["client_cmd"]
        cmd_res_md5 = rec_header_dict["cmd_res_md5"]
        display_data = recv_data.decode("gbk")
        print(display_data)

        # 5.对比发送的数据与接收数据的md5
        md5 = hashlib.md5( recv_data ).hexdigest()
        print(cmd_res_md5 == md5, md5, client_cmd, "\n")

if __name__ == '__main__':
    ClientTCPcmd().CmdSend()
    #dir ipconfig 或ipconfig /all  或 ping www.baidu.com
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,193评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,306评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,130评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,110评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,118评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,085评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,007评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,844评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,283评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,508评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,395评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,985评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,630评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,797评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,653评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,553评论 2 352

推荐阅读更多精彩内容