【问题标题】:Client-Server Discovery Service on localhost本地主机上的客户端-服务器发现服务
【发布时间】:2016-01-28 12:24:34
【问题描述】:

我有一个应用程序,我想扩展它以始终将数据发布到套接字,这样当关键事件发生在任何想要侦听数据包的自定义应用程序时,都可以处理它们。

我的倾向是通过 localhost 上的 UDP 将数据包从服务器发送到所有已知的客户端,这将涉及客户端将消息发送到已知的服务器地址,例如 127.0.0.1:12345,使用他们自己的地址 127.0.0.1:54321 订阅,并且然后,每次事件发生时,服务器都会向每个活动订阅者发送数据包的副本。

我在这里看到了一些需要解决的问题:

  1. 服务器可能在争用,并尝试在127.0.0.1:12345绑定相同的“已知”服务器端口

  2. 需要让客户端了解每个发布消息的可用服务器,以便用户可以选择他们有兴趣收听的服务器

  3. 服务器需要定期询问每个客户端是否仍在侦听,因为这将是 UDP

必须有更好的方法!有什么办法可以让客户端共享同一个端口(那么就不需要客户端-服务器握手)来编写网络通信?如果我想在 LAN 上扩展它,如何轻松将此信息发布到感兴趣的机器(倾向是多播,但这是最干净的方法,当本地主机上存在部分或所有客户端时,如何使多播工作)?

【问题讨论】:

    标签: sockets networking network-programming udp autodiscovery


    【解决方案1】:

    每个解决方案都有其优点和缺点,因此没有更好的方法可以做到这一点。最后,您可能会通过使用特定的库(如 ZeroMQ 或 RabbitMQ)来获得最大的收益,而不是尝试通过编写自己的代码来实现订阅者/发布者和多播模式来重新发明轮子

    编辑:回答你的问题,以防你决定重新发明轮子:

    1) 除了每个唯一的 {Protocol, IP, Port} 元组有一个服务器之外,别无他法。要么让一台服务器兼任多个角色,要么每台服务器拥有一个端口。

    2) 您需要一个服务器注册表才能正常工作。另一种方法是广播消息,用户发送请求服务器以识别自己的身份。

    3) 是的 - 您需要保持活动状态才能知道用户是否仍然存在。或者,用户可以定期联系服务器说我还在这里。

    【讨论】:

    • 真的需要那些消息传递库吗?我需要双向通信的唯一原因是,如果客户端需要告诉服务器它们存在以及它们存在的位置,我希望服务器始终发布到已知地址并且客户端可以来来去去(即使它将我的解决方案限制在本地主机)。
    • 不,它们不是必需的。从需求来看,您似乎即将实现 1) 服务发现; 2) 服务注册; 3) 订阅/发布系统; 4) 客户在场跟踪。如果这是您的应用程序的核心 - 然后 ofc 继续自己做。 OTOH,如果您只需要这些服务-请准备好东西。
    • 是的,但如果我可以向虚空尖叫,那么 1、2、3 和 4 就不再需要了。我可以在协议中添加唯一标识符,这样当 2 个服务器尖叫时,客户端就知道是什么了。
    • 是的,你的服务器也可以把所有数据发送到广播地址,让客户端过滤掉;毕竟这就是收音机在过去 100 年里的工作原理;)
    猜你喜欢
    • 1970-01-01
    • 2014-05-29
    • 1970-01-01
    • 2011-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-26
    相关资源
    最近更新 更多