Пишу тз для клиент-серверного приложения и есть дилемма при выборе модели управления соединениями.
Между приложением и сервером должны передаваться данные и команды. Данные представляют собой бинарный поток неизвестной длины и не имеют признака окончания и проще всего завершать соединение как признак конца передаваемых данных.
Команды представляют собой структурированные данные известной длины. после их передачи соединение завершать не нужно.
Для приложения критичен онлайн клиента.
Варианты:
1) Приложение создает соединение с сервером, данные передаются, соединение закрывается. Как только данные начинают передаваться, создается пулл таких соединений для того чтобы избежать задержек на создание нового соединения когда оно понадобится.
Минусы:
a) может так случиться что первое соединение закрыто, а новые соединения еще не созданы (еще только создаются).
Сервер видит что нет ниодного соединения и читает что клиент в оффе и на сервере придется пилить костыли чтобы обработать это.
Даже если создавать больше 1 соединения первоначально, то неисключено что эти соединения будут завершены прежде чем
будет создано хотябы 1 новое.
b) Данные и команды придется передавать по одним и тем же соединениям. Нужно устанавливать какие-то приоритеты(???)
2) Разделяем соединения на типы: 1 командное которое будет ВСЕГДА онлайн пока приложение онлайн и остальные соединения только для передачи данных. Политика работы с соединениями для передачи данных такая же как и в 1) По командному соединению, соответственно, передаем команды.
Минусы: создаем дополнительное соединение которое будет занимать ресурсы сервера
-------------------------------------------------------------
Есть экзотические варианты, но там совсем уж...
Какую модель используют на практике?
Какие подводные камни?
Хотелось бы критики