У меня есть сервер, который может обрабатывать множество клиентских запросов.
Сервер использует Socket
и TcpClient
- для каждого клиента он открывает новый поток.
Каждый клиент отправляет данные на сервер и ответ сервера.
Но КАК я "отправляю данные":
Клиент: отправляет байт, который представляет: "Я хочу отправить данные",
Сервер: отправляет Ok Я согласен (1 байт ack)
Клиент: отправляет количество байтов длины данных
Сервер: отправляет Ok, я могу справиться с этим
Клиент: отправляет все данные
Сервер: отправляет Ok
Я могу отправлять файлы
Все это отлично работает.
Вопрос
Здесь возникает проблема:
Эти команды (которые я написал) являются действиями пользователя.
Теперь мне нужно добавить чат в этот экран действий
Это не проблема:
Я открою новый поток, который всегда будет в режиме прослушивания сообщений
Но:
Этот поток, который всегда будет слушать, также перехватит сообщения Ack (которые я написал выше) с сервера!
Я не хочу открывать новый канал связи только для чата.
EVen, если я добавлю тип ответа (ACK или CHAT_MESSAGE) - это будет проблемой, потому что ответы для действия пользователя окажутся в потоке прослушивания чата.
Как я могу (в идеале) решить эту проблему? Я в неправильном направлении?
Если вы не хотите открывать новое соединение для чата, вам придется иметь дело с более сложным проводным протоколом:
Вам нужно будет передавать данные и сообщения чата таким образом, чтобы сервер мог узнать, какая из двух идет прямо сейчас. В зависимости от того, какие данные принимаются, его нужно рассматривать по-разному.
Нет смысла читать из одного TCP-соединения с несколькими потоками. TCP не основан на сообщениях. Байты, которые являются входящими, могут быть разбросаны произвольно по потокам. Один поток должен выяснить, какой тип данных подходит и отправить его.
TCP/IP
а вместо этого протокол более высокого уровня, написанный для необходимого вам уровня абстракции и надежности. Учитывая масштаб проблемы, которую вы поставили, я бы предложил использоватьHTTP/REST
качестве протокола высокого уровня.