Примеры использовния библиотеки низкого уровня socket.
import socket
# Создаем TCP/IP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ('localhost', 1234)
sock.connect(server_address)
Кодирование сообщений с использованием struct. Эта библиотека позволяет представить заданную последовательность объектов данных в виде байтового массива.
import socket
import struct
# Список значений
values = (1, b'ab', 2.7)
# Что собираемся передавать: целое, строка длины 2, float (32-бита).
packer = struct.Struct('<I 2s f')
# Для приема данных
unpacker = struct.Struct('<I 2s f')
# Конвертируем данные. Вызов эквивалентен
# packed_data = packer.pack(1, 'ab', 2.7)
packed_data = packer.pack(*values)
try:
# Отправка
print('sending...', packed_data)
sock.sendall(packed_data)
# Получаем данные
# unpacker.size возвращает размер структуры в байтах
echo_message = sock.recv(unpacker.size, socket.MSG_WAITALL)
# Распаковываем сообщение
int_value, two_char, float_value = unpacker.unpack(echo_message)
print(int_value, two_char, float_value) # печатаем
except Exception as e:
print('Exception!!!', e)
finally:
# закрываем сокет
sock.close()
Заметим, что при задании значения переменной value перед
строкой 'ab' стоит символ b. Это означает, что строка является
последовательностью байтов. Обычные строки в python задаются в
кодировке UTF. Такие строки перед передачей нужно закодировать. Если
есть переменная s = 'Какой-то текст в Unicode', то для
преобразования её в массив байт нужно вызвать мметод
encode(): s.encode()
.