У меня есть серверный протокол, который управляет телефонной системой, я уже внедрил клиентскую библиотеку, которая взаимодействует с ней, которая сейчас находится в производстве, однако в настоящее время у меня есть некоторые проблемы с системой, поэтомуЯ подумываю переписать его.
Моя клиентская библиотека в настоящее время написана на Java, но я думаю переписать ее как на C #, так и на Java, чтобы разные клиенты имели доступ к одному и тому же внутреннему интерфейсу.
Сообщения начинаются с ключевого слова, имеют количество байтов метаданных и затем некоторые данные.Сообщения всегда заканчиваются символом конца сообщения.
Связь между клиентом и сервером дуплексная, обычно принимает форму запроса от клиента, что вызывает несколько ответов от сервера, но может быть уведомлением.Сообщения помечены как включенные:
C: команда
P: Ожидание (сервер все еще обрабатывает запрос)
D: данные данных в ответ на
R: Ответ
B: Занят (Сервер слишком занят для обработки ответа)
N: Уведомление
В моей текущей архитектуре есть каждое сообщениеанализируется и создается поток, чтобы обработать его, однако я обнаружил, что некоторые уведомления обрабатываются не по порядку, что вызывает у меня некоторые проблемы, поскольку они должны обрабатываться в том же порядке, в котором они поступают.
Дуплексные сообщения, как правило, имеют следующий формат сообщения: Клиент -> Сервер: Командный сервер -> Клиент: Ожидающий (необязательно) Сервер -> Клиент: Данные (необязательно) Сервер -> Клиент: Ответ (2-я запись в данных сообщения обозначает, является ли этоэто ошибка или нет)
Я использую протокол более года и никогда не видел сообщения о занятости, но это не значит, что они не происходят.
Сервер также можетотправьте уведомления клиенту, и есть несколько сообщений Response, которые автоматически инициируются событиями на сервере, поэтому они отправляются без выполнения соответствующей команды.
Некоторые сообщения уведомления будут поступать как часть последовательности сообщенийНапример,
NotificationName M00001 NotificationName M00001 NotificationName M00000
Строка M0000X означает, что либо имеется больше данных, либо это конец сообщений.
В настоящее время tcp-клиент довольно тупой, он просто порождает поток, который уведомляет подписчика о том, что сообщение получено, событие относится к ключевому слову сообщения и типу сообщения (таким образом, данные, ответы и уведомленияобрабатываются отдельно), это работает довольно эффективно для данных и ответных сообщений, но падает с уведомлениями, так как они, кажется, поступают в быстрой последовательности, и из-за состояния гонки иногда кажется, что конец сообщения проперед обработкой тех, у которых есть данные, что приводит к потере данных сообщения.
Учитывая это действительно плохо написанное описание того, как работает система, как бы вы пошли о написании транспортного кода на стороне клиента?
У метаданных нет номера сообщения, и я не контролирую базовый протокол, так как он предоставляется поставщиком.