1

我正在用 C# 开发一个多客户端/多服务器程序,在深入了解细节之前,我想知道是否有人从事过类似的项目,并且可能能够分享他们的实施技巧/想法。

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

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

编辑:找到这个:http ://code.google.com/p/lidgren-network-gen3/有没有人有任何经验并且可以推荐/不推荐它?

4

2 回答 2

1

我建议NetPeerTcpBindingWCF 通信来创建对等网格。客户端和服务器都将使用对等解析器加入网格。您可以使用 PNRP 或创建自定义对等解析器(.Net 实际上为您提供了一个名为 的实现CustomPeerResolverService)。请参阅对等网络文档

您还可以使用DiscoveryProxy实现发现服务。使用发现服务,服务可以宣布它们的端点。然后,发现服务可以服务查找请求(请参阅FindCriteria)以返回与请求匹配的端点。这称为托管发现。另一种模式是 Ad Hoc Discovery。每个服务都将通过 UDP 宣布它们的端点,并且发现客户端将在网络上探测这些端点。

我实际上已经结合 Peer 2 Peer WCF 网络实现了一个托管发现服务,以提供一个冗余的发现服务网格,所有这些服务都通过 P2P 共享已发布的服务端点。我发现使用 Managed Discovery 的性能要好得多,因为使用 UDP 探测的 Ad Hoc Discovery 速度较慢,并且在跨越某些网络边界时存在一些限制,而 Managed Discovery 利用已公布服务端点的集中存储库。

我认为任何一种/两种技术都可以导致您的解决方案。

于 2012-06-12T15:30:38.180 回答
1

这实际上是一个点对点风格的网络(几乎像 bittorrent),其中所有服务器都是客户端,但并非所有客户端都是服务器。

并且要求是每个客户端都应该包含所有其他服务器(反过来,客户端)的列表。

问题在于首先将服务器 IP 发送给客户端。您可以使用具有固定 DNS 的主服务器充当一种跟踪器,所有服务器都签入该跟踪器,客户端定期检查。

另一种选择(或其他方法)是使用对等交换式系统,其中每个客户端和服务器都使用本地网络上的 UDP 广播数据包来发现彼此,然后传输他们知道的服务器,有点像路由协议。但是,如果 PC 分布在非本地网络(例如 Internet)上,则它们自行发现彼此的可能性很小,因此此方法仅在与其他查找服务器的方法结合使用时才有用。此外,您可能必须处理路由器 UPnP 以允许客户端通过彼此的路由器 NAT 相互连接,因此对于您获得的收益而言,这种方法可能过于复杂。(但是,如果您只是在 LAN 上,这就是您所需要的!)

第三种选择(同样,这听起来很像 torrent 技术)是使用分布式哈希表来存储有关云中服务器 IP 的信息,而不必依赖中央主服务器。

我以前曾尝试过这样的项目(纯 P2P,无服务器消息传递系统),但始终无法让它工作。如果没有大量的对等点,或者没有一个主服务器来跟踪所有其他服务器,那么可靠地检索所有服务器的 IP 是非常困难的。

于 2012-06-12T15:41:26.680 回答