Как узнать, какой TcpClient отправил сообщение на C #

Я создал систему для подключения серии TcpClient к TcpListener и обмена данными в системе, похожей на чат. Как только соединение установлено, сервер добавляет клиента в список и начинает читать поток, ожидая сообщений.

После того как сервер получил сообщение, есть ли встроенный метод, чтобы узнать, какой клиент его отправил?

Альтернатива: я подумал о том, чтобы прикрепить клиентский RemoteEndPoint (порт Ip +) к сообщению, чтобы использовать его в качестве идентификатора, который должен быть одинаковым для двух версий TcpClient на клиенте и на сервере и уникальным по сравнению с другими. клиентов. Я прав?


person Enrico Calzolai    schedule 31.03.2020    source источник
comment
Думаю, государство.   -  person Llama    schedule 31.03.2020
comment
Если клиент теряет и восстанавливает соединение, у него может быть другой порт, но все же тот же клиент ... (логический клиент, а не тот же экземпляр TcpClient)   -  person Fildor    schedule 31.03.2020
comment
Я не возражаю, если клиент потеряет и восстановит соединение, он получит новую личность, для этого нет проблем. @ Джон ммм, я не знаю, что это, вы можете объяснить ^^?   -  person Enrico Calzolai    schedule 31.03.2020


Ответы (1)


После того, как сервер получил сообщение, есть ли встроенный метод, чтобы узнать, какой клиент его отправил?

Все, что вы можете добавить вам; обычно вы должны поддерживать некоторое номинальное состояние для каждого соединения рядом с каждым экземпляром Socket / TcpClient / TcpListener / NetworkStream / Pipe (ваш выбор API), чтобы при получении сообщения вы могли тривиально искать все, что вам нужно. В некоторых случаях может быть достаточно просто использовать экземпляр Socket / TcpClient / etc в качестве ключа, но чаще у вас будет какая-то информация о состоянии / контексте пользователя. По сути, это все, что вам нужно сделать.

person Marc Gravell    schedule 31.03.2020
comment
Спасибо! Но, например, являются ли RemoteEndPoint уникальными данными, которые идентифицируют TcpClient, верно? - person Enrico Calzolai; 31.03.2020
comment
@EnricoCalzolai ну, вроде, но не более чем socket / tcpclient / etc - и это не так полезно, как пользовательский объект состояния - person Marc Gravell; 31.03.2020
comment
Фактически, я думал получить RemoteEndPoint из свойств клиента / сокета TcpClient. Какие еще уникальные свойства, которые я могу передать через поток, вы имеете в виду? - person Enrico Calzolai; 31.03.2020
comment
@EnricoCalzolai независимо от контекста приложения, который нужен вашему коду; например, у многих API есть какая-то аутентификация / рукопожатие, поэтому вы можете отслеживать токен пользователя, подверсию протокола и любое другое состояние соединения, которое вам нужно, текущую комнату, например, в контексте приложения чата. - person Marc Gravell; 31.03.2020