davinctor
@davinctor

Как правильно распределить одновременное получение данных на Socket?

Столкнулся вот с такой проблемой. Есть сервер и n-количество клиентов. Каждый клиент может запросить некоторую инфу с сервера, например, текущее время. Но, помимо этого, сервер каждые 10 минут сам отправляет время на клиента. Еще немного подробностей, клиент посылает запрос - и ответом на него сервер посылает время.
Но как быть, когда клиент посылает запрос серверу и одновременно в это время сервер отправляет свою 10-минутную рассылку?
Получается следующее - сервер может попытаться отправить данные по запросу и рассылку одним пакетом(TCP/IP) - результатом будет время, которое продублировано и остается еще один нюанс. Клиент то ожидает только одну строку, например, и хочет получить только ее одну, а приходит несколько.

Я уже думал, что для рассылки стоит новое соединение выделить, но мне кажется, что слишком ресурсоемко.
Помогите совет, пожалуйста.
  • Вопрос задан
  • 2876 просмотров
Решения вопроса 1
davinctor
@davinctor Автор вопроса
Ответ оказался прост. Никак. Данные одновременно нельзя получить из одного соединения, т.к. у каждого соединения только один поток ввода и один поток вывода.
Решения оказалось таким - и рассылка погоды, и простые ответы сервера посылались со специальным префиксом команды (обычный текст, например обычный ответ за запрос клиента - response: Текст ответа; а рассылка начиналась с delivery: Текст ответа рассылки). Ответы я читаю в двух местах - место ожидания рассылки и место ожидания простого ответа на команду клиента, но обработка происходила в одном месте. То есть парсил свой ответ я в одном месте. А слушателя у меня два. Всем спасибо за ответы.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
gbg
@gbg
Баянист. Тамада. Услуги.
Строго говоря, в TCP нет понятия отдельного пакета - это относится к более выскому уровню взаимодействия приложений. TCP предоставляет возможность передавать поток байт. Да, внутри TCP этот поток разбивается и передается внутри пакетов, но приложение не должно влезать в этот процесс.

Разбивку сообщений на собственные пакеты для отправки может себе организовать программист. Формат такого пакета - минимальный заголовок
struct mheader
{
    uint32_t type;
    uint32_t data;
};
и следом за ним сразу данные.

Если применена классическая архитектура многопоточного сервера (на каждое соединение - свой поток), не составит большого труда это организовать.

Хорошая книжка - Йон Снейдер, Эффективное программирование TCP/IP
1004494083.jpg
Ответ написан
@dtestyk
Судя по вопросу данные дублируются. Можно попробовать варианты:
-читать только первую строку там где не рассчитано на большее
-ввести таймаут на любые посылки сервера одному клиенту(если данные дублируются не полностью, за время таймаута можно их аггрегировать)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Navigine Москва
от 80 000 до 110 000 руб.
Heedbook Москва
До 200 000 руб.
Unitarius Москва
от 130 000 до 180 000 руб.
17 сент. 2019, в 00:06
200 руб./в час
17 сент. 2019, в 00:03
200 руб./за проект
16 сент. 2019, в 22:51
100 руб./за проект