zoukankan      html  css  js  c++  java
  • subprocess、struct模块的简单应用与ssh模型(黏包)

    一、subprocess模块  #可以通过传递字符串命令,帮你去实现一些操作系统的命令。

    import subprocess
    res = subprocess.Popen("dir",
                           shell=True,
                           stderr=subprocess.PIPE,
                           stdout=subprocess.PIPE
                           )
    ret = res.stdout.read().decode("gbk")
    print(ret)

    二、struct模块

    import struct
    res = struct.pack("i",6465789)  #"q",8个字节
    print(res)  #b'xfdxa8bx00'
    print(len(res)) #4
    ret = struct.unpack("i",res)
    print(ret)   #(6465789,)
    print(ret[0])   #6465789

    三、ssh模型(黏包)

    server

    import subprocess
    import socket
    import struct
    
    server = socket.socket()
    server.bind(("127.0.0.1",8101))
    server.listen(5)
    while 1:
        conn,addr = server.accept()
        while 1:
            try:
                server_cmd = conn.recv(1024).decode("utf8")
                res = subprocess.Popen(server_cmd,
                                       shell=True,
                                       stderr=subprocess.PIPE,
                                       stdout=subprocess.PIPE
                                       )
                if server_cmd == b"exit":
                    break
                response1 = res.stdout.read()
                response2 = res.stderr.read()
                if response2:
                    pack = struct.pack("i",(len(response2)))
                    conn.send(pack)
                    conn.send(response2)
                else:
                    pack = struct.pack("i",(len(response1)))
                    conn.send(pack)
                    conn.send(response1)
            except Exception as e:
                break
        conn.close()

    client

    import socket
    import struct
    client = socket.socket()
    client.connect(("127.0.0.1",8101))
    while 1:
        client_cmd = input("请输入您的命令:")
        client.send(client_cmd.encode("utf8"))
        if client_cmd == "exit":
            break
        if client_cmd == "":
            continue
        pack = client.recv(4)
        print(pack)
        data_length = struct.unpack("i",pack)[0]
        print(data_length)
        recv_data_length = 0
        recv_data = b""
    
        while recv_data_length < data_length:
            data = client.recv(1024)
            recv_data_length += len(data)
            recv_data += data
    
        print(recv_data.decode("gbk"))
    
    client.close()
  • 相关阅读:
    Webform中linq to sql多条件查询(小练习)
    Webform购物车(用Session存储,页面传值)
    C#操控条形码扫描枪
    C#汉字转拼音首字母
    简单的实现QQ通信功能(五)
    简单的实现QQ通信功能(四)
    简单的实现QQ通信功能(三)
    简单的实现QQ通信功能(二)
    简单的实现QQ通信功能(一)
    利用数据集进行数据访问操作
  • 原文地址:https://www.cnblogs.com/qq849784670/p/9585513.html
Copyright © 2011-2022 走看看