使用 Java EE Websocket API 接收 ping
Posted
技术标签:
【中文标题】使用 Java EE Websocket API 接收 ping【英文标题】:Receiving pings with Java EE Websocket API 【发布时间】:2014-06-25 18:45:51 【问题描述】:我目前正在使用 Java Websocket API 的 Tyrus 参考实现。我已经成功创建了一个接收二进制消息、文本消息和 pong 消息的服务器端点,但我一直试图让它接收 ping 消息。我搜索了大部分 Tyrus 源代码并阅读了 Jave EE Websocket 教程,但都没有演示接收 ping 的功能(仅用于发送它们)。有谁知道这是否是当前 API 无法实现的?如果没有,您能否指出接收 ping 消息的正确方向?
【问题讨论】:
【参考方案1】:您无法处理 ping 消息。 JSR 356(WebSocket 的 Java API)规范确实声明实现必须始终响应 ping,而不给应用程序任何与这些请求交互的机会。
您只能发送 ping 和消耗 pong:
@OnMessage
public void onPong(PongMessage pongMessage)
//...
你为什么要这么做?
【讨论】:
好吧,我正在尝试制作一个 websocket 代理服务器。我要连接到代理服务器的客户端之一定期发送 ping 以检查连接状态。我注意到你是 Tyrus 的开发者。你认为破解库为我的应用程序挂上钩子有多难。顺便说一句,谢谢您的回复! 有趣的用例......不,这应该不难做到;我认为困难的部分是执行握手并在出现问题时将信息正确传递给原始客户端..如果您想将升级响应标头传递回客户端 - 这将很困难。否则应该没问题。如果您使您的功能可配置,我们甚至可以将您的更改应用到 Tyrus.. @pavel-bucek 你解决了这个问题吗?我也偶然发现了这个缺失的功能,但我不确定它是否在此期间得到解决。 (不使用 Tyrus,而是使用 Undertow 中的 JBoss WebSocket API) @DennisLaumen 我已经离开了,但我可以说我只花了 2 天时间就破解了 Tyrus 并使用我自己的内部 Tyrus 构建来使 WebSockets 工作。显然不理想,但当时所有其他的 WebSockets 实现也没有这个功能,所以我做了。 @2300Worker 感谢这些年来的回复;-)。我目前正在使用一种替代解决方案来保持活力,我们已经大部分采用了。使用 pings 是一种优化,目前还不是必需的,但将来可能会。以上是关于使用 Java EE Websocket API 接收 ping的主要内容,如果未能解决你的问题,请参考以下文章
Java EE Websocket编程端点如何使用Pathparams?