【问题标题】:C# Looking for 2 way communication. (WCF)C#寻找2路通信。 (WCF)
【发布时间】:2025-12-26 22:50:12
【问题描述】:

我的程序:

  1. 不同的客户端连接到服务器(用户登录)

  2. 然后服务器开始每秒(或更少)推送小数据(小于 1KB)给所有这些数据。

我的问题:

  1. 我应该使用什么服务? WCF 是正确的吗?
  2. 如果是 WCF,那么使用哪个协议? http、tcp ... ?

起初我认为 WCF 是正确的选择。我实现了一个基本的简单。然后突然我注意到这只是一个客户端到服务器的连接。并且服务器无法以相同的方式与客户端通信。除非我也在客户端启动服务,这使它成为服务器。

所以最后,考虑到我提到的速度因素和要使用的正确协议,我应该如何实现服务器和客户端之间的这种 2 路通信。

更新

好的,让我添加一些细节。这实际上是一个教师客户端服务器学生客户端通信程序。老师在 WPF 的 inkCanvas 上画了一些东西。这幅画应该被推送给所有学生客户。这就是为什么这些数据应该由服务器推送。并且通信必须是两种方式。

【问题讨论】:

标签: c# wcf client-server protocols


【解决方案1】:

一种可能性是使用network library。查看this 关于使用 NetworkComms.Net 创建 WPF 聊天应用程序的文章。与 WCF 相比,客户端 -> 服务器、服务器 -> 客户端关系是对称的,因此推送通知是完全直接的。您还可以选择通信协议,例如TCP 或 UDP,并且可以轻松添加您自己的扩展来处理传出/传入数据。

免责声明 - 我是这个库的开发人员。

【讨论】:

  • 哇,谢谢!库代码示例看起来很简单。将在几分钟内开始工作。但是你能告诉我为什么你建议在 WCF 上使用它
  • 这绝对是偏好和编码背景的问题,两者都可以达到相同的效果。恕我直言(我承认我可能有点偏见)NetworkComms.Net 比 WCF 更强大,当然更容易实现。
【解决方案2】:

我实现了完全相同的功能来在两个 WPF 应用程序之间进行通信。要回答您的问题,是的,我认为 WCF 是最好的方法。我猜你已经使用 WCF 实现了单向通信。为了能够让服务器与客户端对话,您需要实现回调,here 是一篇不错的文章。

【讨论】:

    【解决方案3】:

    最好不要让服务器向其客户端推送数据,而是让客户端从服务器拉取数据。虽然这可以通过双工实现,但并不强烈推荐,因为大多数 ISP 或服务器环境出于安全原因不允许来自其防火墙内的出站消息。

    这是我的建议:

    让客户端应用程序偶尔从服务器拉取,而不是让服务器推送给它的客户端。这样一来,服务器就不必有固定的连接,因为它不能扩展,更重要的是,通信连接是来自一个应用程序(即服务器)的非常昂贵的资源。

    重新设计你的方法。

    【讨论】:

    • 好的,我在帖子中添加了更新。这就是我需要服务器推送数据的原因。
    • 我认为@xperator 是对的。在您的情况下,学生客户端应该以循环方式从服务器刷新数据,以检查来自教师客户端的数据。那么你必须提供这两种客户端。
    • 感谢您的更新。从可扩展性的角度来看,我的方法仍然是一个更好的解决方案。例如,这就是消息总线通过 pub/sub 模型工作的方式。看起来 sub 会收到通知,但实际上客户端会提取数据。为了帮助您可视化这一点,请将服务器视为一个队列。教师在队列上发送消息(推送)。客户端有一个后台线程定期检查队列(拉)。看看 RabbitMQ。这将使用称为主题的概念来满足您的需要。
    【解决方案4】:

    我使用 net.tcp 编写了一个托管在 Windows 服务上的 WCF 服务器,它绝对可以将数据推送到多个客户端。该框架为您完成了大部分侦听、接受和多个连接,因此肯定会产生很多好处。

    您的场景中棘手的部分是与学生客户端共享来自教学客户端的数据。 AFAIK,没有内置的方法可以将数据从一个客户端-服务器连接传输到另一个。

    一种天真的但简单的方法是将教师数据存储到临时位置(如文件或数据库,并对其具有某种互斥锁),当需要将数据传输给学生时,只需从临时位置读取位置。

    或者您可以将您的架构更改为Peer-To-Peer

    【讨论】: