Отправка и получение сообщений Protobuf¶
Процесс отправки и получения сообщения различается для стандартов TCP и WebSocket. Ниже мы подробно объясняем этот процесс для обоих типов соединений.
Использование TCP ¶
Отправка сообщения ¶
Для отправки сообщения через соединение TCP выполните следующие действия:
-
Преобразуйте сообщение Protobuf в массив байтов (используя кодировку Protobuf) с помощью официального SDK Google Protocol Buffer для выбранного вами языка программирования.
-
Получите длину массива, созданного на шаге 1. Создайте новый массив байтов из этого целого числа. Переверните новый массив байтов.
-
Объедините новый массив байтов и массив байтов, содержащий исходное сообщение Protobuf.
-
Отправьте объединенный массив в поток соединения.
Приведенные ниже примеры демонстрируют, как эти шаги выполняются в официальных SDK Open API.
1 2 3 4 5 6 7 | |
1 2 3 | |
Пример на Python
Используя Twisted, пример на Python выполняет практически те же операции, что и пример на C#. Команду client.send(request) можно объяснить следующим образом.
1 2 3 | |
Protocol.transport.write(). Чтение сообщения ¶
Асинхронный код
Все SDK Open API основаны на асинхронном выполнении, что означает, что они не ожидают прибытия сообщений, а вместо этого реагируют на динамически поступающие сообщения. В результате получение сообщения обычно выполняется через обработчики событий
Для чтения сообщения вам потребуется выполнить последовательность действий, обратную шагам, необходимым для отправки сообщения.
-
Получите первые четыре байта массива байтов (помните, они обозначают длину сообщения). Переверните эти четыре байта и преобразуйте их в целое число.
-
Прочитайте
Xколичество байтов из потока, гдеX— это целое число, полученное на шаге 1. -
Используйте SDK Google Protobuf для десериализации сообщения в допустимое
ProtoMessage. -
Используйте поле
payloadTypeобъектаProtoMessage, чтобы найти его фактический тип. С помощью SDK Google Protobuf преобразуйтеProtoMessageв объект требуемого типаProtoOA....
Приведенные ниже фрагменты кода демонстрируют, как официальные SDK Open API подходят к чтению сообщений.
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | |
Пример на Python
В примере на Python все операции с байтами при получении сообщений обрабатываются методом dataReceived(), как показано ниже.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | |
1 2 3 4 5 6 7 8 | |
Использование WebSocket ¶
Отправка сообщения ¶
Для отправки сообщения через соединение WebSocket выполните следующие действия:
-
Сериализуйте сообщение в любой подходящий формат данных (например, строку).
-
Добавьте сериализованное сообщение в очередь отправки.
Приведенные ниже примеры демонстрируют, как эти действия выполняются в официальных SDK Open API.
SDK для C# использует класс WebsocketClient, который является частью пакета Websocket.Client. Как показано ниже, метод WebsocketClient.Send() работает следующим образом.
1 2 3 4 5 | |
Как видите, клиент просто добавляет сегмент массива в очередь отправки.
SDK для Python не поддерживает стандарт WebSocket.
Получение сообщения ¶
Чтобы получить сообщение через соединение WebSocket, выполните следующие действия:
-
Получите данные, полученные от серверной части cTrader.
-
Десериализуйте данные в допустимое сообщение Protobuf.
Примеры того, как это делается в официальных SDK Open API, см. во фрагментах ниже.
Для получения сообщений WebsocketClient необходимо подписать на функцию обратного вызова, которая обрабатывает действия клиента при принятии нового сообщения.
1 2 | |
Перед подпиской SDK для .NET анализирует сообщение в сообщение Protobuf. Необходимые подписки добавляются в теле обратного вызова ConnectWebSocket().
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | |
В обратном вызове OnNext() ProtoMessage передается в обратный вызов MessageFactory.GetMessage().
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 | |
SDK для Python не поддерживает стандарт WebSocket.