C# 中的多客户端/服务器发现
本文关键字:服务器 发现 客户端 | 更新日期: 2023-09-27 18:36:59
我正在用 C# 开发一个多客户端/多服务器程序,在我深入了解细节之前,我想知道是否有人曾经从事过类似的项目,并且可能能够分享他们的实施技巧/想法。
- 服务器将位于许多PC上,并侦听来自客户端的传入连接(或者服务器应该广播,客户端应该侦听?
- 当客户端启动时,它应自动填充潜在服务器 IP 地址的列表。
- 当服务器关闭时,客户端应从其列表中删除该服务器。
- 当新服务器启动时,应通知客户端并将其添加到其列表中。 服务器
- 也可以充当客户端,并且应该能够看到自身以及所有其他服务器。 从客户端发送到服务器的消息
- (影响服务器)应将更改广播到所有连接的客户端。
- 我的服务器应该是 Windows 服务吗?这有什么优点/缺点?
关于我如何开始做这件事的任何想法?我一直在研究UDP多播和局域网扫描。我正在使用 C# 和 .NET 4.0
编辑:发现这个:http://code.google.com/p/lidgren-network-gen3/有人有任何经验并且可以推荐/不推荐它吗?
我建议NetPeerTcpBinding
WCF通信来创建对等网格。客户端和服务器都将使用对等解析器加入网格。您可以使用PNRP或创建自定义对等解析程序(.Net实际上为您提供了一个名为CustomPeerResolverService
的实现)。请参阅对等网络文档。
您也可以使用 DiscoveryProxy 实现发现服务。使用发现服务,服务可以宣布其终结点。然后,发现服务可以为查找请求提供服务(请参阅查找条件),以返回与请求匹配的终结点。这称为托管发现。另一种模式是临时发现。每个服务将通过 UDP 宣布其终结点,发现客户端将探测网络中的这些终结点。
我实际上已经实现了托管发现服务与对等 2 对等 WCF 网络相结合,以提供发现服务的冗余网格,所有发现服务都通过 P2P 共享已发布的服务终结点。使用托管发现,我发现性能要好得多,因为使用 UDP 探测的临时发现速度较慢,并且跨越某些网络边界存在一些限制,而托管发现则利用已宣布的服务终结点的集中存储库。
我认为其中一种/两种技术都可以导致您的解决方案。
因此,这实际上是一个点对点风格的网络(几乎像bittorrent),其中所有服务器都是客户端,但并非所有客户端都是服务器。
要求是每个客户端都应该持有所有其他服务器(反过来是客户端)的列表。
问题在于首先将服务器IP提供给客户端。您可以使用具有固定 DNS 的主服务器充当一种跟踪器,所有服务器都签入该跟踪器,客户端会定期检查该跟踪器。
另一种选择(或另一种方法)是使用对等交换样式系统,其中每个客户端和服务器都使用本地网络上的UDP广播数据包来发现彼此,然后传输它们知道的服务器,有点像路由协议。但是,如果 PC 分布在非本地网络(如 Internet)上,则它们自己发现彼此的可能性很小,因此此方法仅在与其他查找服务器的方法结合使用时才有用。此外,您可能必须处理路由器 UPnP 以允许客户端通过彼此路由器 NAT 相互连接,因此此方法对于您获得的收益来说可能太复杂了。(但是,如果您只是在 LAN 上,这就是您所需要的!
第三种选择(同样,这听起来很像torrent技术)是使用分布式哈希表将有关服务器IP的信息存储在云中,而不必依赖中央主服务器。
我以前尝试过这样的项目(一个纯粹的P2P,无服务器消息传递系统),但永远无法让它工作。如果没有大量的对等方或主服务器来跟踪所有其他服务器,就很难可靠地检索所有服务器的IP。