【问题标题】:How to find which TcpClient had send a message in C#如何在 C# 中查找哪个 TcpClient 发送了消息
【发布时间】:2020-07-11 16:58:48
【问题描述】:

我创建了一个系统来将一系列 TcpClient 连接到一个 TcpListener 并在类似聊天的系统中交换数据。建立连接后,服务器将客户端添加到列表中,并开始读取等待消息的流。

服务器收到消息后,是否有内置方法可以知道是哪个客户端发送的?

替代方案:我想到了将客户端的RemoteEndPoint(Ip+端口)附加到消息中作为标识符使用,在客户端和服务器上的TcpClient两个版本之间应该是相同的,并且唯一比较给其他客户。我说的对吗?

【问题讨论】:

  • 状态,我想。
  • 如果客户端丢失并重新建立连接,它可能有另一个端口但仍然是同一个客户端...(逻辑客户端,不是同一个TcpClient实例)
  • 我不介意,如果客户端丢失并重新建立连接,他们将获得一个新的身份,这没问题。 @John mmm,我不知道那是什么,你能解释一下吗^^?

标签: c# tcpclient endpoint tcplistener


【解决方案1】:

服务器收到消息后,是否有内置方法可以知道是哪个客户端发送的?

可以添加的任何东西;通常,您会在每个 Socket / TcpClient / TcpListener / NetworkStream / Pipe (您选择的 API)实例旁边维护一些标称的每个连接状态,以便在收到消息时可以轻松查找随便你想要什么。在某些情况下,使用Socket / TcpClient / etc 实例作为键可能就足够了,但更多时候你会得到某种用户状态/上下文信息。这基本上完全由您来实现。

【讨论】:

  • 好的,谢谢!但是,例如,RemoteEndPoint 是识别 TcpClient 的唯一数据,对吗?
  • @EnricoCalzolai 好吧,有点,但不会比 socket/tcpclient/etc 更多 - 而且它不如自定义状态对象有用
  • 其实我是想从TcpClient的Client/Socket属性中获取RemoteEndPoint。您指的是我可以通过流传输的其他哪些独特属性?
  • @EnricoCalzolai 您的代码需要的任何特定于应用程序的上下文;例如,许多 API 具有某种身份验证/握手功能,因此您可能正在跟踪用户令牌、协议子版本以及您需要的任何其他连接状态,例如“当前房间”,例如,在聊天的上下文中应用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-26
  • 1970-01-01
相关资源
最近更新 更多