Форум программистов, компьютерный форум, киберфорум
Python: Сети
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/65: Рейтинг темы: голосов - 65, средняя оценка - 4.68
3 / 3 / 1
Регистрация: 26.10.2010
Сообщений: 42
1

Правильный socket send и json

05.01.2015, 22:38. Показов 12191. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Хочу через socket бросит объект dict, для этого делаю его:
Python
1
data = {"data":{"hostname":"192.168.7.6","ipaddress":"192.168.7.6","comment":"АдминистраторСервер", "command":"discovery"}}
Python
1
2
3
4
import json
s = json.dumps(data)
print(s)
conn.send(s)
Это до отправки в socket
Python
1
{"data": {"comment": "\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0421\u0435\u0440\u0432\u0435\u0440", "command": "discovery", "hostname": "192.168.7.6", "ipaddress": "192.168.7.6"}}

С другой стороны:
Python
1
2
raw_data = conn.recv(2048)
data = json.loads(raw_data)
Результат:
Python
1
{u'data': {u'comment': u'\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0421\u0435\u0440\u0432\u0435\u0440', u'ipaddress': u'192.168.7.6', u'hostname': u'192.168.7.6', u'command': u'discovery'}}
Попытка его вывести в print:
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-18: ordinal not in range(128)
потому что объект в unicode
Прогонять словарь в цикле и делать для каждого поля encode ну мне кажется как-то не правильно. Есть способ получить объект в той же кодировке что изначально был передан?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.01.2015, 22:38
Ответы с готовыми решениями:

Assembler linux. Socket recv and socket send invalid arguments
Пишу шеллкод. Он ожидает подключения с 2222 порта, сам подключается на 1111 порт, выделяет память,...

Socket Send и Recieve
private void update_table() { Stopwatch sw = new Stopwatch(); ...

SOCKET: send(), recv()
Начал разбираться с сокетами и в самом начале застрял на элементарном, с функциями send и recv, в...

Send struct from socket
Здравствуйте, помогите пожалуйста отправить структуру на ++... typedef struct { unsigned int...

Вылет при socket.send()
Когда вызываю сокет.send или BeginSend, то прога тупо вылетает, без ошибок и eceptionoв. Если...

4
42 / 42 / 7
Регистрация: 15.07.2012
Сообщений: 98
05.01.2015, 23:53 2
pickle ?
0
224 / 209 / 63
Регистрация: 26.05.2011
Сообщений: 363
06.01.2015, 02:39 3
Вы версию python'а не указали.
Для 3.х: Функции send и recv работают с байтами, поэтому процесс кодирования и декодирования необходим.
Python
1
2
3
4
5
raw_data = json.dumps(data, ensure_ascii=False).encode("utf-8")
conn.send(raw_data)
...
raw_data = conn.recv(2048)
data = json.loads(raw_data.decode("utf-8"))
0
3 / 3 / 1
Регистрация: 26.10.2010
Сообщений: 42
07.01.2015, 23:18  [ТС] 4
К счастью на pickle как раз все работает, но хочется разобраться, ведь с json тоже надо работать.
python 2.7

pyuser, попробовал, к сожалению все равно данные приходят в utf-8
У меня чувство что из-за того что raw_data это обьект dict там decode не действует.

Добавлено через 10 минут
хм. похоже действительно делаю что-то не правильно, вот из консоли:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
In [32]: dict = {"data":{"hostname":"192.168.7.6","ipaddress":"192.168.7.6","comment":"АдминистраторСервер", "command":"discovery", "verbose":True}}
 
In [33]: d
Out[33]: 
{'data': {'command': 'discovery',
  'comment': '\xd0\x90\xd0\xb4\xd0\xbc\xd0\xb8\xd0\xbd\xd0\xb8\xd1\x81\xd1\x82\xd1\x80\xd0\xb0\xd1\x82\xd0\xbe\xd1\x80\xd0\xa1\xd0\xb5\xd1\x80\xd0\xb2\xd0\xb5\xd1\x80',
  'hostname': '192.168.7.6',
  'ipaddress': '192.168.7.6',
  'verbose': True}}
 
 
In [36]: print(type(d))
<type 'dict'>
 
In [35]: dump = json.dumps(d)
In [37]: print(type(dump))
<type 'str'>
 
In [38]: load = json.loads(dump)
In [39]: print(type(load))
<type 'dict'>
 
 
Out[40]: 
{u'data': {u'command': u'discovery',
  u'comment': u'\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0421\u0435\u0440\u0432\u0435\u0440',
  u'hostname': u'192.168.7.6',
  u'ipaddress': u'192.168.7.6',
  u'verbose': True}}
 
In [41]:
Добавлено через 10 минут
Правильно понимаю что это особенность JSONDecoder? из str в python через load в любом случае получаем utf-8
https://docs.python.org/2/libr... o-py-table
0
363 / 334 / 38
Регистрация: 29.03.2011
Сообщений: 838
08.01.2015, 13:44 5
InventoR, это особенность спеков: валидная json-строка обязана быть в юникоде.
0
08.01.2015, 13:44
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.01.2015, 13:44
Помогаю со студенческими работами здесь

Send/recv on listener socket
После переведения сокета в режим прослушивания (bind, listen), возможны ли на нем операции...

Как избежать зависания на Socket.Send()?
Вообщем при большом трафике на сервере (C# Mono Ubuntu 16.04) как я понял если клиент отключается в...

Socket не отсылает сообщения через SEND и не принимает
Когда конектится клиент с сервером, сервер должен отображать то, что передает клиент, т.е. asdf, но...

Client Socket Send Text В разных переменных
Имеется код, передает с двух эдитов текст на сервер procedure TForm1.Button2Click(Sender:...

Отправка сообщений клиенту командой Socket.Send
Проблема заключается в том что когда я вызываю метод send подряд раза 2-3, то получается что на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru