5

最近,我一直在研究一个由 TCP客户端-服务器模型反向连接)利用的应用程序。

为了提高长时间运行的操作的性能,我已经使客户端应用程序的单个实例可以与服务器建立多个传出套接字连接。

当服务器应用程序接受传入连接时,表示该连接的子套接字被封装在一个名为 a 的类的新实例中ServerChildSocket

我需要某种方法来有效地对ServerChildSocket从同一客户端应用程序实例传播的所有实例进行分组,但我正在努力开发一种可行的方法,更不用说一种好的方法了。

我的目标是ServerChildSocket在与此类似的类中相应地对实例进行分组...

class UserState
{
     ServerChildSocket MainConnection {get; set;}
     ServerChildSocket FileDownloadConnection {get; set;}
     ServerChildSocket VoiceChatConnection {get; set;}
}

如何识别哪些连接源自同一个客户端应用程序实例,然后将连接相应地分配给UserState类的实例?


我相信客户端应用程序需要在连接建立后立即发送一些关于连接意图的初步信息(主连接?下载连接?等)。不过,我正在努力想办法将这一切结合在一起。

4

2 回答 2

7

在您的协议中包括从服务器到每个客户端的“客户端 ID”分配,以及根据预期用途标记每个连接的想法。

当客户端与服务器建立主要连接时,握手的相关部分如下所示:

             CLIENT                          SERVER

           Type = Main    =============>
           Id   = null

                          <=============    Id = 123

然后,当客户端进行额外的侧通道连接时,它将在初始握手中包含服务器返回的 id:

             CLIENT                          SERVER

           Type = Chat    =============>
           Id   = 123

这样服务器就知道每个接受的连接属于哪个客户端,并且也没有意外冲突的危险(服务器不会将相同的 id 分配给多个客户端)。最后,您可以使 id 尽可能大且不可预测,以防止客户端欺骗彼此的侧通道连接。

于 2013-09-28T18:03:31.050 回答
2

您正在寻找的似乎是服务器端会话管理之类的东西。
架构路线图的描述,可以看到在 Web 服务器中的实现

Stan Kirk贡献了一篇名为C# SocketAsyncEventArgs 高性能套接字代码的高级帖子,通过会话 ID 处理UserToken确认。

我认为结合 Stan Kirk 的实现来创建会话 ID 并将其存储在并发哈希映射中,例如ConcurrentDictionary(TKey 作为会话 ID,TValue 作为 UserState)将对您有所帮助。

于 2013-10-05T16:58:20.893 回答