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

C# C语言中的多客户端/服务器发现#,c#,networking,network-programming,client,client-server,C#,Networking,Network Programming,Client,Client Server,我正在用C#开发一个多客户机/多服务器程序,在我开始讨论细节之前,我想知道是否有人曾经参与过类似的项目,也许能够分享他们的实现技巧/想法 服务器将安装在许多PC机上,并监听来自客户端的传入连接(或者服务器应该广播,客户端监听?) 当客户端启动时,它应该自动填充一个潜在服务器IP地址列表 当服务器关闭时,客户端应将该服务器从其列表中删除 当新服务器启动时,应通知客户端并将其添加到其列表中 服务器也可以充当客户机,并且应该能够看到自己以及所有其他服务器 从客户端发送到服务器的影响服务器的消息应将更

我正在用C#开发一个多客户机/多服务器程序,在我开始讨论细节之前,我想知道是否有人曾经参与过类似的项目,也许能够分享他们的实现技巧/想法

  • 服务器将安装在许多PC机上,并监听来自客户端的传入连接(或者服务器应该广播,客户端监听?)
  • 当客户端启动时,它应该自动填充一个潜在服务器IP地址列表
  • 当服务器关闭时,客户端应将该服务器从其列表中删除
  • 当新服务器启动时,应通知客户端并将其添加到其列表中
  • 服务器也可以充当客户机,并且应该能够看到自己以及所有其他服务器
  • 从客户端发送到服务器的影响服务器的消息应将更改广播到所有连接的客户端
  • 我的服务器应该是Windows服务吗?这有什么优点/缺点
关于我如何开始这件事有什么想法吗?我一直在研究UDP多播和局域网扫描。我正在使用C#和.NET4.0


编辑:发现此问题:是否有人对此有任何经验,可以推荐/不推荐?

我建议
NetPeerTcpBinding
WCF communications创建对等网格。客户端和服务器都将使用对等解析程序加入网格。您可以使用PNRP或创建自定义对等解析程序(.Net实际上为您提供了一个名为
CustomPeerSolverService
)的实现。看

您还可以使用实现发现服务。使用发现服务,服务可以宣布其端点。然后,发现服务可以为find请求提供服务(请参阅),以返回与请求匹配的端点。这称为托管发现。另一种模式是临时发现。每个服务将通过UDP宣布其端点,发现客户端将探测网络中的这些端点

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


我认为这两种技术中的任何一种都可以为您提供解决方案。

因此,这是一种有效的对等式网络(几乎像bittorrent),其中所有服务器都是客户端,但并非所有客户端都是服务器

并且要求每个客户机都应该持有所有其他服务器的列表(这些服务器反过来又是客户机)

问题在于首先要将服务器IP发送到客户端。您可以使用具有固定DNS的主服务器作为一种跟踪器,所有服务器都会签入该跟踪器,并且客户端会定期进行检查

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

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


我曾经尝试过这样一个项目(一个纯粹的P2P、无服务器的消息传递系统),但从来没有让它工作过。如果没有大量的对等服务器或主服务器来跟踪所有其他服务器,则很难可靠地检索所有服务器的IP。

嗨,Jim,我想尝试托管发现服务(如果我没有弄错的话,称为WS-Discovery),但我发现它是针对WCF的,正如您所提到的。我没有WCF方面的经验,需要在两种获胜形式之间实现这一点。(Client.exe应用程序和Server.exe托盘应用程序)您知道这是否可行吗?您是否有任何链接可以帮助我在winform中实现WCF?我尝试过谷歌搜索,但WCF把我甩了。:)谢谢编辑:现在阅读更多关于WCF的信息,它可能正是我们所需要的我会继续挖的@DTI Matt,是的,WCF只需要一个主机进程。您可以非常轻松地创建WCF。查看此处了解更多信息: