【问题标题】:Send message to client any moment Netty Io随时向客户端发送消息 Netty Io
【发布时间】:2017-10-26 19:34:34
【问题描述】:

我有一个基于微服务的架构,netty io 运行在 spring boot 应用程序上,当我想向客户端发送消息时,我必须等待来自客户端的消息才能将回复发送给我想要的人发送。 我怎么能不等他和我沟通就给他发消息呢? 这一步我迷路了。

【问题讨论】:

  • 使用两个连接,或检查 http 管道是如何完成的 (en.wikipedia.org/wiki/HTTP_pipelining)。
  • 我该怎么做?
  • 在netty中,没有任何线索,但是使用原始tcp,使用一个连接发送,一个接收。
  • 您可以将消息保存到消息队列(如rabbitmq)中,然后直接返回服务器。另一方面,您将从该消息队列中检索消息并将回复发送给某人你想要的。

标签: java server netty


【解决方案1】:

你可以这样处理:

  1. 让客户端连接到您的服务器上
  2. 让客户端发送一个Hello Message(确定是你的客户端之一)
  3. 在服务器上捕获消息并将引用存储在通道上(通过调用 ctx.channel() 在每个通道处理程序上可用)
  4. 捕获channelInactive 事件以在客户端断开连接时删除引用

除了等待 HelloMessage 之外,您还可以捕获 channelActive 事件,但每次有人连接到您侦听的端口时都会触发它,即使不是您的客户端之一。这就是为什么我更喜欢使用“Hello Message”

现在,您在频道上有一个参考,您可以随时致电channel.writeAndFlush() 发送消息

【讨论】:

  • 但是我的一个疑问是,我怎么能使用这个从另一个微服务打开的通道?我可以将它放入一个变量中并将其封装以从异步方法中使用?
  • 不,你不能,可能你需要定义一个不同的工作流程,例如使用一个微服务来接收/传递消息(如发布-订阅模式),我们没有太多有关您的架构和代码的信息
  • 这个想法是让端点接收应该发送给客户端的命令,接收该命令并通过 RabbitMQ 中的队列将其发送到所有 Socket 服务器节点,看看客户端是什么并通过消费者从队列中发送消息
  • 但是我看到 channel.write()channel.writeAndFlush() 不是线程安全的 [stackoverflow.com/questions/11095044/…,所以我最终将所有写请求发布到一个环形缓冲区以由单处理线。对此有任何想法吗?主动向客户端发送消息,或者客户端之间的对话是很常见的场景,需要解决。
猜你喜欢
  • 2015-04-07
  • 1970-01-01
  • 2017-03-08
  • 1970-01-01
  • 2016-09-20
  • 2013-05-20
  • 1970-01-01
  • 1970-01-01
  • 2019-04-29
相关资源
最近更新 更多