Сетевое программирование на Python

Примеры использовния библиотеки низкого уровня 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().