Пакеты

Оглавление

1. Типов данных не существует

Данные между компьютерами передаются с помощью пакетов.

Первое правило, которое стоит усвоить. Такой вещи, как типы данных не существует. Любой объект, с которым вы работаете в программе, это последовательность байт, которые для удобства представлены единым объектом. Важной особенностью является то, что под разными платформами и на разных системах данные хранятся по-разному.

Поэтому для сервера требуется определить протокол взаимодействия с ним: то как именно, какие данные и в каком порядке передаются.

2. Протокол

Для того, чтобы составить или интерпретировать пакет, надо знать правила его построения. Пакет состоит из нескольких разделов разной длины, содержащих какую-то информацию, например:

Но несмотря на 1 первый пункт, зачастую нам приходится иметь дело с некоторыми стандартными типами, например, с числами и строками.

3. Числа

Самый простой из универсальных типов данных - это число. Для того, чтобы однозначно интерпретироваться при чтении, число должно иметь фиксированную длину, т.е. занимать определённое число байт.

Тогда запись и чтение происходит с помощью двух простых циклов. Приведу пример записи на питоне: запись осуществляется в bytearray, являющийся массивом байт, размер которого автоматически увеличивается:

  1. def append_number(data: bytearray, number: int, size: int):
  2.     '''Первым аргументом идёт bytearray. 
  3.     Вторым идёт число, которое должно быть добавлено, 
  4.     третьим размер добавляемого числа. 
  5.     Процедура добавит это число в последовательность data'''
  6.     for i in range(size):
  7.         data.append(number & 255)
  8.         number = number >> 8

Вы можете самостоятельно написать обратное преобразование.

4. Строки

Строки используются также часто, как и числа. Но, одновременно с этим, это далеко не самый простой тип данных. Для того, чтобы отправить и прочитать строку, надо выбрать кодировку. Существует много видов кодировок, в данный момент (2021г) рекомендуется использовать кодировку UTF-8.

Большинство современных фреймворков и языков хранят строку в своём внутреннем представлении и предоставляют возможность кодировать строку в различных кодировках. В библиотеке языка Python есть метод encode для кодирования и decode для чтения.

После перевода в двоичный вид, есть 3 стандартных способа отправить строку: нультерминированная строка, строка фиксированной длины, строка с указанным размером.

Первый способ подразумевает отправку строки, последний символ которой имеет код 0. Строка считывается до тех пор, пока не встречен 0. Раздел под строку имеет нефиксированный размер.

Второй способ: строка должна содержать заранее определённое число символов. Возможна комбинация с первым и третьим способом, тогда размер раздела фиксируется.

Третий способ: вместе со строкой мы отправляем число - её размер. Размер отправляется перед самой строкой. Раздел под строку имеет нефиксированный размер.