Расширение .Net Socket для поддержки ACK и чата?

1

У меня есть сервер, который может обрабатывать множество клиентских запросов.

Сервер использует Socket и TcpClient - для каждого клиента он открывает новый поток.

Каждый клиент отправляет данные на сервер и ответ сервера.

Но КАК я "отправляю данные":

  • Клиент: отправляет байт, который представляет: "Я хочу отправить данные",

  • Сервер: отправляет Ok Я согласен (1 байт ack)

  • Клиент: отправляет количество байтов длины данных

  • Сервер: отправляет Ok, я могу справиться с этим

  • Клиент: отправляет все данные

  • Сервер: отправляет Ok

Я могу отправлять файлы

Все это отлично работает.

Вопрос

Здесь возникает проблема:

Эти команды (которые я написал) являются действиями пользователя.

Теперь мне нужно добавить чат в этот экран действий

Это не проблема:

Я открою новый поток, который всегда будет в режиме прослушивания сообщений

Но:

Этот поток, который всегда будет слушать, также перехватит сообщения Ack (которые я написал выше) с сервера!

Я не хочу открывать новый канал связи только для чата.

EVen, если я добавлю тип ответа (ACK или CHAT_MESSAGE) - это будет проблемой, потому что ответы для действия пользователя окажутся в потоке прослушивания чата.

Как я могу (в идеале) решить эту проблему? Я в неправильном направлении?

  • 0
    Учитывая язык, который вы используете, он звучит так, как будто вы не хотите использовать TCP/IP а вместо этого протокол более высокого уровня, написанный для необходимого вам уровня абстракции и надежности. Учитывая масштаб проблемы, которую вы поставили, я бы предложил использовать HTTP/REST качестве протокола высокого уровня.
Теги:
multithreading
sockets
tcpclient

1 ответ

2
Лучший ответ

Если вы не хотите открывать новое соединение для чата, вам придется иметь дело с более сложным проводным протоколом:

Вам нужно будет передавать данные и сообщения чата таким образом, чтобы сервер мог узнать, какая из двух идет прямо сейчас. В зависимости от того, какие данные принимаются, его нужно рассматривать по-разному.

Нет смысла читать из одного TCP-соединения с несколькими потоками. TCP не основан на сообщениях. Байты, которые являются входящими, могут быть разбросаны произвольно по потокам. Один поток должен выяснить, какой тип данных подходит и отправить его.

  • 0
    +1 Просто чтобы убедиться: когда вы говорите: это не имеет смысла - вы относитесь к теме «прослушать второй поток», верно? не для "сервер открывает новую тему для каждого клиента", не могли бы вы подтвердить?
  • 0
    Да. Открытие нового потока для каждого клиента абсолютно безопасно.
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню