Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 本地主机上的客户端服务器发现服务_Sockets_Networking_Network Programming_Udp_Autodiscovery - Fatal编程技术网

Sockets 本地主机上的客户端服务器发现服务

Sockets 本地主机上的客户端服务器发现服务,sockets,networking,network-programming,udp,autodiscovery,Sockets,Networking,Network Programming,Udp,Autodiscovery,我有一个应用程序,我想扩展它,使其始终将数据发布到套接字,以便当任何想要侦听数据包的自定义应用程序发生关键事件时,都可以处理它们 我倾向于通过localhost上的UDP将数据包从服务器发送到所有已知的客户端,这将涉及客户端向已知的服务器地址发送消息,例如127.0.0.1:12345,使用自己的地址订阅127.0.0.1:54321,然后,服务器在每次事件发生时向每个活动订户发送数据包的副本 我在这里看到了一些需要解决的问题: 服务器可能处于争用状态,并尝试在127.0.0.1:12345处绑

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

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

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

  • 服务器可能处于争用状态,并尝试在
    127.0.0.1:12345处绑定相同的“已知”服务器端口

  • 客户机需要知道发布消息的每个可用服务器,以便用户可以选择他们感兴趣的服务器

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


  • 一定有更好的办法!有没有什么方法可以让客户端共享同一个端口来编写网络通信(这样就不需要客户端与服务器握手)?如果我想在局域网上扩展这一功能,我如何能够轻松地将此信息发布到感兴趣的机器上(这是多播,但这是最干净的方法吗?当本地主机上存在一些或所有客户端时,我如何使多播工作)?

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

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

    1) 除了为每个唯一的{Protocol,IP,Port}元组提供一个服务器之外,没有其他方法。允许一台服务器戴几个帽子,或者每个服务器有一个端口

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


    3) 是-你需要一个keepalive来知道用户是否还在那里。或者,用户可以定期联系服务器,说我还在这里。

    这些消息库真的需要吗?我需要双向通信的唯一原因是,如果客户端需要告诉服务器它们存在以及它们存在的位置,我希望服务器总是发布到已知地址,客户端可以来来去去去(即使它将我的解决方案限制为localhost)。不,不需要。从需求来看,您似乎即将实现1)服务发现;2) 服务注册处;3) 订阅/发布系统;4) 客户端状态跟踪。如果这是你应用程序的核心,那么ofc就自己动手吧。如果你只是需要这些服务,那就去准备一些现成的吧。对,但是如果我能在虚空中尖叫,那么1,2,3,4就不再需要了。我可以在协议中添加唯一的标识符,这样当两台服务器发出尖叫时,客户端就知道是什么了;毕竟,这就是无线电在过去100年中的工作原理;)