如何按套接字连接传播的客户端应用程序实例对套接字连接进行分组

本文关键字:套接字 连接 实例 客户端 何按 传播 应用程序 | 更新日期: 2023-09-27 18:33:00

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

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

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

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

我的目标是将ServerChildSocket实例相应地分组到与此类似的类中......

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

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


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

如何按套接字连接传播的客户端应用程序实例对套接字连接进行分组

包括从

服务器到协议中每个客户端的"客户端 ID"的分配,以及根据其预期用途标记每个连接的想法。

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

             CLIENT                          SERVER
           Type = Main    =============>
           Id   = null
                          <=============    Id = 123

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

             CLIENT                          SERVER
           Type = Chat    =============>
           Id   = 123

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

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

Stan Kirk贡献了一篇名为C# SocketAsyncEventArgs High Performance Socket Code的高级文章,通过session-ID处理UserToken确认。

我认为结合Stan Kirk的实现来创建会话ID并将其存储在concurrent-Hash-Map中,如ConcurrentDictionary(TKey作为session-id,TValue作为UserState(将对您有所帮助。