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

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

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

Студворк — интернет-сервис помощи студентам
Хочу через 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
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(); sw.Start(); string status...

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

4
42 / 42 / 7
Регистрация: 15.07.2012
Сообщений: 98
05.01.2015, 23:53
pickle ?
0
224 / 209 / 63
Регистрация: 26.05.2011
Сообщений: 363
06.01.2015, 02:39
Вы версию 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  [ТС]
К счастью на 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
InventoR, это особенность спеков: валидная json-строка обязана быть в юникоде.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.01.2015, 13:44
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru