python - socketserver 模块应用
2021-05-18 15:29
                         标签:proc   解封装   send   +=   交互   popen   while   self   erro    server端:   client端:   python - socketserver 模块应用 标签:proc   解封装   send   +=   交互   popen   while   self   erro    原文地址:https://www.cnblogs.com/Anec/p/9675336.htmlimport socketserver
import subprocess
import json
import struct
class MyTCPHandler(socketserver.BaseRequestHandler):
    print("执行程序")
    def handle(self):  #所有请求的交互都是在handle里执行的,
        while True:
            try:
                # 获取指令
                self.data = self.request.recv(1024).strip()
                zl_s = self.data.decode()
                # 指令执行返回数据
                data = subprocess.Popen(zl_s, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
                data_Y_b = data.stdout.read()
                data_E_b = data.stderr.read()
                # 封装数据总长度
                data_len = len(data_Y_b) + len(data_E_b)
                data_dict = {"data_dict": data_len}
                json_data_s = json.dumps(data_dict)
                # 封装head部长度
                json_data_b = json_data_s.encode()
                head_len_i = len(json_data_b)
                # 封装前4个字节长度
                head_len_b = struct.pack("i", head_len_i)
                # 发送4个字节,发送head,发送数据
                self.request.sendall(head_len_b)
                self.request.sendall(json_data_b)
                self.request.sendall(data_Y_b)
                self.request.sendall(data_E_b)
            except ConnectionResetError as e:
                print("err ",e)
                break
if __name__ == "__main__":
    HOST, PORT = "127.0.0.1", 8080
    server = socketserver.ThreadingTCPServer((HOST, PORT), MyTCPHandler)   #线程
    server.serve_forever()
import socket
import json
import struct
ip = "127.0.0.1"
port = 8080
ip_port = (ip,port)
buffer_size = 1024
client_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client_socket.connect(ip_port)
while True:
    #发送指令至服务端.
    zhiling_s = input(">>>:").strip()
    if not zhiling_s:continue
    zhiling_b = zhiling_s.encode()
    client_socket.send(zhiling_b)
#层层封装,收取对应数据对应长度,解封装.
    #获取前四个字节长度
    head_len_b = client_socket.recv(4)
    head_len_i = struct.unpack(‘i‘,head_len_b)[0]
    print(head_len_i)
    #获取head部长度
    json_data_b = client_socket.recv(head_len_i)
    print(len(json_data_b))
    #获取数据总长度
    json_data_s = json_data_b.decode()
    data_dict = json.loads(json_data_s)
    data_len = data_dict["data_dict"]
    print(data_len)
    #循环收取总数据
    data_len_recv = 0
    data = b""
    while data_len_recv  data_len:
        data += client_socket.recv(buffer_size)
        data_len_recv += len(data)
    print(data.decode("gbk"))
client_socket.close()
下一篇:python学习基础1
文章标题:python - socketserver 模块应用
文章链接:http://soscw.com/index.php/essay/87249.html