python 网络编程相关问题

kangshuaibo2018       4 年, 7 月 前       1804

python3中,使用scoket模块和subprocess编写一个简单的数据传输模块:客户端发送一个Windows下的终端命令,服务端使用subprocess模块执行这个命令并返回执行结构给客户端。编写完成之后使用其他命令都可以正常执行,但就是使用ipconfig/all这个命令会一直卡在那,不报错也不执行,这是怎么回事?

server.py

import socket import subprocess import struct

server = socket.socket()

IP = str(input("请输入你的IP:"))

port = int(input("请输入你的端口:"))

server.bind(('127.0.0.1',1234)) server.listen(5)

while 1: print("server is working...") conn,addr = server.accept()

while 1:
    try:
        cmd = conn.recv(1024).decode("utf8")  # 获取到客户端发来的命令
        print("cmd = ",cmd)
        if cmd == b"exit":
            print("断开连接...")
            break
        res = subprocess.Popen(cmd,
                               shell=True,
                               stderr=subprocess.PIPE,
                               stdout=subprocess.PIPE,
                               )
        print("*******")
        err = res.stderr.read()    # 读取错误
        stu = res.stdout.read()     # 读取正确信息
        print("响应长度:",len(stu))
        print("错误长度:",len(err))
        if err:
            # 构建报头
            header_pack = struct.pack("i", len(err))
            # 发送报头
            conn.send(header_pack)  # 将正确获取到的信息返回给客户端
            # 发送数据
            conn.send(err)      # 将错误信息返回给客户端
        else:
            # 构建报头
            header_pack = struct.pack("i",len(stu))
            # 发送报头
            conn.send(header_pack)      # 将正确获取到的信息返回给客户端
            # 发送数据
            conn.send(stu)
            break
    except Exception as e:
        break
conn.close()

client.py

import socket import struct client = socket.socket()

IP = str(input("请输入你的IP:"))

port = int(input("请输入你的端口:"))

client.connect(('127.0.0.1',1234))

while 1: print("clien is working...")

# 发送命令
cmd = input("请输入命令:")
client.send(cmd.encode("gbk"))
if cmd == "":
    continue
if cmd == "exit":
    break

# 先接收4个字节,获取数据长度
header_pack = client.recv(4)
data_length = struct.unpack("i",header_pack)[0]   # 获取到数据长度的值:例如1200字节
print("data_length = ",data_length)


recv_data_length = 0   # 剩余数据长度
recv_data = b""        # 获取到的数据

while recv_data_length < data_length:
    # 由于是现接受了4个字节,所以之后再次接受后面的数据就可以按照数据的长度来接收:每次都接收1024字节的数据
    data = client.recv(1024)
    recv_data_length = recv_data_length + len(data)
    recv_data = recv_data + data

# 接收命令执行返回值
response = recv_data.decode("gbk")
print(response)

client.close()

1 回复  |  直到 Aug 27, 2019

yufei

#1   •   4 年, 7 月 前   •  

抱歉,最近忙到死,都没空搭理这个站,我回去试一试

简单教程 = 简单教程,简单编程
简单教程 是一个关于技术和学习的地方
现在注册
已注册用户请 登入
什么意思
什么意思
关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.