![]() |
1
1
最初,我通过同步访问用于维护连接的资源来解决了我的问题。每当我添加一个新的连接时,我都锁定了这个资源(通用列表)。我还锁定了资源,每当我通过它枚举时,同时将数据推送到连接的套接字。 在C中,我会使用的关键字是 锁 ;因为我在使用vb.net,所以我使用了 同步时钟 关键字。这个 锁 或 同步时钟 ,关键字防止多个线程访问线程资源。只要每段代码在使用前都锁定了资源,这就可以工作。 这个解决方案可以工作;但是,正如Doug指出的,新的连接必须等待服务器完成将数据推送到连接的客户机。随着服务器推送数据的频率增加,连接的客户机数量增加,我开始注意到新客户机连接需要一段时间。 这个问题在我的场景中没有那么严重,因为在我开始注意到任何服务器连接延迟时间之前,我能够打开45个连接。即便如此,在连接启动之前也只是几秒钟的事情。但在其他情况下,这可能会很糟糕,所以我重新考虑了我的设计,这将引导我找到当前的解决方案。此解决方案不涉及通过已连接客户机列表枚举以推送数据。这意味着我唯一需要的时间 锁 (或) 同步时钟 )当添加新的AsyncClientConnections或删除不再连接的AsyncClientConnections时,将列出已连接的AsyncClientConnections。换句话说,在推送数据时,传入连接不必等待连接。 我当前的解决方案有4个组件:
pusherserver包含一个datagetter实例和一个AsyncClientConnections列表。当一个新的套接字连接建立到pusherserver时,它会创建一个新的AsyncClientConnection,并将一个引用传递给套接字连接和一个对datagetter的引用。 创建新的AsyncClientConnection时,它指定一个方法,用于处理Datagetter的DataRetrieved事件。 现在,当Datagetter实例引发DataRetrieved事件时,所有连接的AsyncClientConnections都会将检索到的数据推送到客户端。不需要通过AsyncClientConnections列表进行枚举,推送数据时不需要锁定AsyncClientConnections列表,建立连接比第一个解决方案更快更顺畅。 希望这能帮助其他面临同样问题的人。 -弗林尼 |
![]() |
2
0
解决方案的一个问题是,您将在整个推送操作中持有一个锁。如果这需要很长时间,新客户机将被阻塞,直到发生这种情况。当您增加被推送数据的频率时,这可以有效地阻止新客户机。 我建议您锁定列表,制作一个副本,释放锁,然后枚举副本以发送数据。这在负载下可能会表现得更好。(请记住,您复制的是列表,而不是列表中的基础对象) |
![]() |
user2138149 · 双栈网络服务器无法按预期处理ipv4请求 4 月前 |
![]() |
Triet Doan · 套接字的类型提示是什么? 10 月前 |
![]() |
Ames ISU · 套接字缓冲区在Linux中是如何工作的? 11 月前 |