Найти - Пользователи
Полная версия: Отправка данных через сокет
Начало » Python для новичков » Отправка данных через сокет
1
k0st1an
Нужно отправить запрос на удаленный сервер. Получение ответа пока не требуется, нужно понять как кодировать данные для отправки. Проблем с сомой отправкой нет. Я не как не могу понять как преобразовать сами данные, перед их отправкой. Если не сложно привести простой пример как это сделать на python3. Или может есть хорошая статья по этой теме.


Конечно есть готовые либы. Есть python-valve. Судя по всему это очень качественная либа. Но написана изначально на 2 версии языка. Вроде как должна работать на 3 версии, но то и дело то там, то там ошибка. И не работает с некоторыми с серверами.
doza_and
А стандартный модуль struct не помогает?
k0st1an
Да, этот модуль используется в python-valve. Там просто жуткое количество encode… И разобраться в них не получается ->.
doza_and
k0st1an
И разобраться в них не получается
Ну я не знаю. Там реального кода строчек 30. Думаю меньше не получится с любым другим модулем. Если вы в этом не можете разобраться то вам остается только заказать другим эту работу.
k0st1an
Не, не могу заказывать. Нужно самому… Всегда получалось и тут получится. )))
doza_and
k0st1an
но то и дело то там, то там ошибка
k0st1an
Нужно самому…
Тогда
1. Запишите ошибки которые вам мешают. (Сообщения об ошибках публикуйте тут)
2. свяжитесь с авторами библиотеки. Не исключено что они помогут.
3. Возможно что-то поправите сами, или с нашей помощью.
k0st1an
Я думал об этом. Но я сейчас работаю над одним проектом и терять время на этом не хочется. Пока я буду пользоваться своим костылем. Вот это кусок работает, получает данные. Теперь надо их в словарь раскидать
(мне то надо всего три значения выдернуть):

#!/usr/bin/env python3
import socket
import struct
import select
host = ('a.b.c.d', 27015)
host2 = ('localhost', 8888)
BUFF = 1400
A2S_INFO = 0x54
A2S_PAYLOAD = 'Source Engine Query'
BytesField = '<B'
StringField = '<s'
LongField = '<l'
header = struct.pack(LongField, -1)
request_type = struct.pack(BytesField, A2S_INFO)
payload = A2S_PAYLOAD.encode(encoding='utf-8')
packet = b''.join([header, request_type, payload, b'\x00'])
print('header', header)
print('request_type:', request_type)
print('payload:', payload)
print('packet:', packet)
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.sendto(packet, host)
r = select.select([s], [], [], 4)
print(r[0][0].recv(BUFF))

Мой код конечно просто ужасен. Но сетевым программированием не занимался, даже тут мало что понимаю (например про header, это видимо стандартно, так как в документации ничего про это нет, но в чужом коде это увидел и применил). Когда основная часть проекта будет завершена, я смогу уделить больше времени либо своей либе, либо той. Надо еще посмотреть под какой она там лицензией..


В той либе ошибки именно поддержки серверов. Самих серверов полно, и некоторые отдают данные по разному. Где-то в коде видел коммент, что это пока не поддерживается, то скоро будет. Так что возможно когда я закончу, они уже допилят. )))
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB