我有一个应用程序,我想扩展到始终将数据发布到套接字,以便当任何想要侦听数据包的自定义应用程序发生关键事件时,可以处理它们 .
我倾向于通过UDP在服务器上发送数据包到所有已知的客户端,这些客户端将涉及客户端发送消息到已知的服务器地址,例如 127.0.0.1:12345
,使用他们自己的地址订阅 127.0.0.1:54321
,然后服务器发送一份副本每次事件发生时,每个活动用户的数据包 .
我看到一些需要解决的问题:
-
服务器可能处于争用状态,并尝试在
127.0.0.1:12345
绑定相同的"known"服务器端口 -
客户端需要了解每个可用的服务器发布消息,以便用户可以选择他们有兴趣收听的服务器
-
服务器需要定期询问每个客户端是否仍在监听,因为这将是UDP
一定有更好的方法!有没有什么办法可以让客户端共享同一个端口(然后不需要进行客户端 - 服务器握手)来编写网络通信?如果我想通过局域网扩展这一点怎么办?如何轻松地将这些信息发布到感兴趣的机器上(倾向于多播,但这是最干净的方法,当localhost上存在某些或所有客户端时,如何使多播工作)?
1 回答
每种解决方案都有其优点和缺点,因此没有更好的方法 . 最后,通过使用特定的库来实现应用程序间消息传递(如ZeroMQ或RabbitMQ)而不是尝试通过编写自己的代码来实现订阅者/发布者和多播模式来重新发明轮子,您可能获得最大收益
编辑:为了回答您的问题,以防您决定重新发明轮子:
1)除了每个唯一的{Protocol,IP,Port}元组具有单个服务器之外别无他法 . 允许一台服务器戴上几顶帽子或每台服务器有一个端口 .
2)您需要一个服务器注册表才能工作 . 替代方案可以是用户发送请求服务器以标识自己的广播消息 .
3)是的 - 你需要一个keepalive来知道用户是否还在那里 . 或者,用户可以定期联系服务器,说我还在这里 .