代码之家  ›  专栏  ›  技术社区  ›  Kenny Mann

WinForms服务器和客户端之间的通信

  •  3
  • Kenny Mann  · 技术社区  · 16 年前

    我有50多台亭式计算机,我希望能够从一台计算机上按需(而不是间隔)获得状态更新。这些计算机与请求状态的计算机在局域网上。

    我研究过WCF,但是看起来我需要安装IIS,我不想在50多个Windows XP盒子上安装IIS——所以我认为除非有可能让WinForm主机安装WebService,否则就不需要使用WebService了?

    我还研究了使用system.net.sockets,甚至得到了一个几乎不能正常工作的原型,但是我觉得自己不够熟练,无法使它成为一个可靠可靠的系统。考虑到这条路径,我需要了解更多关于套接字编程和线程的信息。

    这些框运行的是.NET 3.5 SP1,因此我在.NET版本中具有完全的灵活性,不过我还是要坚持使用C。

    实现这一点的最佳方法是什么?我应该多学点套接字,还是.NET有更好的方法来处理这个问题?

    编辑: 我打算进行双向沟通,直到我意识到我所需要的只是单向沟通。

    编辑2: 我避免使用传统的服务器/客户机,而是使用相反的方法,因为我想避免占用太多的带宽,并且不确定我在说什么样的开销。我也希望能对独立的报摊有更多的控制权。看了之后,我想我仍然可以用WCF和IP连接(我不知道我可以用IP连接,我想我必须添加50个Web服务或其他东西)。

    8 回复  |  直到 14 年前
        1
  •  2
  •   Whisk    16 年前

    除非你计划将其扩展到几千个客户,否则我认为WCF性能甚至不会是一个边缘问题。您可以轻松地从Windows服务或WinForms应用程序托管WCF服务,并且您会发现,一旦获得关键概念,使用WCF工作将非常简单。

    我已经部署了类似的东西,大约有100-150个客户取得了巨大的成功。

    网络上有很多资源可以让你开始-下面是一个让你开始的资源:

    http://msdn.microsoft.com/en-us/library/aa480190.aspx

        2
  •  4
  •   Ray Lu    16 年前

    WCF不必托管在IIS中,它可以作为控制台应用程序或Windows服务托管在WinForm中。 您可以让每台计算机在WinForm中承载其服务,并在您自己的计算机中编写一个程序来调用每台计算机的服务以获取状态信息。

    另一种方法是在您自己的计算机上托管一个服务,并使50多台计算机在更新其状态后调用该服务,您可以使用该服务的数据库来保存网络中每个节点的状态数据。此选项易于维护和扩展。

    附笔。 WCF的目标是替换.NET远程处理,替代方法可以是net.tcp绑定或net.pipe。

        3
  •  2
  •   MusiGenesis    16 年前

    无论您在中央服务器上使用Web服务还是WCF,您只需要在服务器上安装和配置IIS(而不是在50多个客户机上)。

    您试图做的是从这个问题上看有点不清楚,但是如果客户机需要调用服务器(例如,为了获得服务器状态),那么他们只需要在服务器上运行的WebService上调用一个方法。

    如果您需要让服务器不时地调用客户机,那么每次客户机启动时,您都需要让每个客户机调用服务器Web服务上的登录方法。登录方法将从客户端获取委托方法作为参数。然后,当服务器需要来自客户机的信息时,它将调用此委托。

    用自己的Web服务设置每个客户机将代表传统(一个服务器,多个客户机)客户机/服务器体系结构的反转,正如您已经注意到的,这是不实际的。

        4
  •  2
  •   Peter Wone    16 年前

    不要使用远程处理。

    如果您想要健壮性和可伸缩性,那么最终会排除除基本上无状态的远程过程调用之外的所有调用。由于这正是Web服务的功能,而且Web服务更简单、更容易构建,远程处理本质上是一种无意义的技术。

    远程委托的回调在性能/可靠性禁止列表中,因此如果您考虑使用远程处理,请重新考虑。

    使用Web服务。

    我知道你不想参加投票,但我认为你不需要。既然你说你的所有设备都在一个网段上,那么我建议使用udp进行广播更改通知,基本上设置一个脏标志,并允许应用程序按需(重新)获取。它仍然不可靠,但很容易,而且速度很快,因为它是广播的。

    正如其他人所说,你不需要IIS,你可以自己主持。见 ServiceHost class 有关如何执行此操作的详细信息。

        5
  •  1
  •   orrsella    16 年前

    我建议使用.NET远程处理。它很容易实现,不需要其他任何东西。

        6
  •  0
  •   Aristotle Ucab    16 年前

    对我来说,学习网络更好。或者是插座通讯的手动方式。由于包含元数据,Web服务速度变慢了。

    您的客户机和服务器可以转换为多线程应用程序。只是模仿请求和响应体系结构。像这样的网络应用程序很容易实现。

        7
  •  0
  •   faulty    16 年前

    如果只需要状态更新,可以使用更简单的解决方案,例如简单的TCP服务器/客户机消息传递,或者像Orssella所说的远程处理。WCF在这里有点过分了。

    不过需要注意的是,如果您的50多个信息亭都是通过互联网连接的,那么您可能需要使用VPN或在每个信息亭上有一个开放端口(这是一个安全风险),以便您的服务器可以从每个信息亭检索状态更新。

    我们有一个类似的情况,但是状态是定期发送到我们的服务器,所以我们只有一个端口来保护/安全。更新频率可配置为适应较慢的客户机。

        8
  •  0
  •   Noctris    14 年前

    作为一个拥有超过500多个客户并不断成长的人:

    信息排队是一种方式。

    我们已经从一个内部开发的TCP服务器和客户端到WCF轮询,并以消息队列结束。这是唯一有保证的通过互联网从客户机和服务器获取数据的方法。作为额外的好处,这些解决方案中的许多都有一个广泛的框架,使得实现发布订阅、单向发送、点到点发送和请求回复变得非常简单。其中一些是可以与WCF,但它将涉及哭,喊叫,呜咽和长夜,更不用说加仑的咖啡。

    一些重要的评论:

    让一个进程对客户机进行轮询,而不是相反=坏主意。它根本不可扩展,当过程需要很长时间才能完成时,您很快就会遇到麻烦。更不用说必须处理所有IP地址(您是否可以访问所需端口上的所有客户机)?当IP发生变化时会发生什么。)

    我们所做的:客户机定期向中心消息队列发送状态更新(您可以在UI中轻松实现实时更新),它还侦听自己的队列中的getStatusRequest消息。如果它收到这个,它会回答(有一个超时)。这样,我们可以随时查看所有客户机的总体状态,并在需要时获取特定客户机的特定状态。

    关于带宽:信息亭通常显示图像/视频等。1KB或更少的状态消息不会是很大的开销。

    我不能过分强调您当前的设计将有一个非常密集的开发周期,并且不能很好地扩展或扩展(相信我,我们已经吸取了这一课)。除此之外,为这种类型的东西构建一个好的客户机/服务器协议是一项艰巨的工作,如果您犯了一个设计错误(迁移一个协议并不容易),那么在之后将完全无用。

    我们已经构建了ActiveMQ的解决方案ontop(使用NMS库C),目前正在为我们的内部工作扩展简单的服务总线。

    我们只使用wcf在winforms应用程序和集中式服务之间进行通信。