我正在用C#开发一个多客户端/多服务器程序,在我开始讨论细节之前,我想知道是否有人曾经从事类似的项目并且可能能够分享他们的提示/想法实施
关于如何开始这方面的任何想法?我一直在研究UDP组播和局域网扫描。我正在使用C#和.NET 4.0
编辑:发现:http://code.google.com/p/lidgren-network-gen3/有没有人有任何经验,可以推荐/不推荐它?答案 0 :(得分:1)
我建议NetPeerTcpBinding
WCF通信来创建对等网格。客户端和服务器都将使用对等解析器连接网格。您可以使用PNRP或创建自定义对等解析器(.Net实际上为您提供了一个名为CustomPeerResolverService
的实现)。请参阅Peer To Peer Networking documentation。
您也可以使用DiscoveryProxy实施发现服务。通过发现服务,服务可以宣布其端点。然后,发现服务可以为查找请求提供服务(请参阅FindCriteria)以返回与请求匹配的端点。这称为托管发现。另一种模式是Ad Hoc Discovery。每个服务都将通过UDP公布其端点,发现客户端将探测这些端点的网络。
我实际上已经将Peaged Discovery服务与Peer 2 Peer WCF网络结合使用,以提供所有通过P2P共享已发布服务端点的发现服务的冗余网格。使用托管发现我发现性能要好得多,因为使用UDP探测的Ad Hoc Discovery较慢,并且跨越某些网络边界有一些限制,而Managed Discovery利用已公布服务端点的集中存储库。
我认为这两种技术都可以带来您的解决方案。
答案 1 :(得分:1)
这实际上是一种点对点风格的网络(几乎像bittorrent),其中所有服务器都是客户端,但并非所有客户端都是服务器。
并且要求是每个客户端都应该拥有所有其他服务器(反过来又是客户端)的列表。
问题在于首先将服务器IP提供给客户端。您可以使用具有固定DNS的主服务器作为一种跟踪器,所有服务器都会检入该跟踪器,并且客户端会定期检查。
另一个选项(或其他方法)是使用对等交换方式系统,其中每个客户端和服务器使用本地网络上的UDP广播数据包发现彼此,然后传输他们所知道的服务器,类型像路由协议。但是,如果PC分布在非本地网络(例如互联网)上,那么他们很可能会自己发现彼此,这种方法只有在与其他查找服务器的方法结合使用时才有用。此外,您可能必须处理路由器UPnP以允许客户端通过彼此的路由器NAT相互连接,因此这种方法可能太复杂,无法获得收益。 (但是,如果您只是在局域网上,这就是您所需要的!)
第三种选择(再次,这听起来很像洪流技术),就是使用Distributed Hash Tables在云中存储有关服务器IP的信息,而不必依赖中央主服务器。
我之前曾经参与过这样的项目(一个纯粹的P2P,无服务器的消息传递系统),但却无法让它发挥作用。如果没有大量的对等体或主服务器来跟踪所有其他服务器,则很难可靠地检索所有服务器的IP。