C#中的多客户端/服务器发现

时间:2012-06-12 14:45:53

标签: c# networking network-programming client client-server

我正在用C#开发一个多客户端/多服务器程序,在我开始讨论细节之前,我想知道是否有人曾经从事类似的项目并且可能能够分享他们的提示/想法实施

  • 服务器将位于许多PC上,并侦听来自客户端的传入连接(或者服务器是否广播,客户端是否应该监听?)。
  • 当客户端启动时,它应自动填充潜在服务器IP地址列表。
  • 当服务器关闭时,客户端应从其列表中删除该服务器。
  • 当新服务器启动时,应通知客户端并将其添加到其列表中。
  • 服务器也可以充当客户端,并且应该能够看到自己以及所有其他服务器。
  • 从客户端发送到服务器的消息会影响服务器,应该将更改广播到所有连接的客户端。
  • 我的服务器应该是Windows服务吗?这有什么优点/缺点?

关于如何开始这方面的任何想法?我一直在研究UDP组播和局域网扫描。我正在使用C#和.NET 4.0

编辑:发现:http://code.google.com/p/lidgren-network-gen3/有没有人有任何经验,可以推荐/不推荐它?

2 个答案:

答案 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。