处理javax Websocket中的ping消息

4

我在Glassfish 4上部署了一个Websocket服务器,想使用ping/pong机制。我的计划是定期从服务器向客户端发送ping信息,如果客户端没有返回pong信息,则关闭连接。不幸的是,似乎没有任何可以实现这个功能的方法。

@OnMessage
public void onMessage(PingMessage pingMessage)

在javax.websocket.ClientEndpoint或ServerEndpoint中,您可以反应ping消息。

或者使用其他方法来处理ping消息。 由于某些非常奇怪的原因,当我在Eclipse中部署服务器时,即使我从未在客户端中实现它,我也会收到pong消息。但是当我使用glassfish maven插件在我的服务器上部署时,我再也没有收到任何pong消息了。


1
你确定Glassfish不会自行定期向客户端发送ping请求吗? - vtortola
可能是因为它没有返回有关与服务器端点的丢失连接的任何信息。未关闭的会话仍然存在 :( - ThommyH
嗯,还有一个事实是,在处理程序中实际获取到pong消息...这相当奇怪,我的意思是,它应该透明地处理它们。看起来有点粗糙。 - vtortola
根据Tyrus开发人员在类似问题上的回答,没有API来处理ping,因为这应该始终由您的WebSocket容器自动处理。因此,您只需要API来发送pings并对pongs做出反应。 - morgwai
2个回答

2

事实证明,服务器部分没有完全部署,这导致了Eclipse和服务器之间出现了奇怪的差异。 但无论如何,你不能自己处理ping消息仍然很奇怪。想象一下,你想要处理它或将其用于发送状态或其他用途...


如果你想这样做,那就创建你自己的乒乓消息。为什么要偏离规范并通过改变内置内容破坏与其他客户端的向后兼容性呢? - Martin Konecny
我猜想原因是它是一种非常低级的机制,没有人认为你会想要对其做出反应。就像在TCP层面上没有API可以对KEEP_ALIVE做出反应一样。处理它的唯一正确方式是发送PONG,这由容器完成。 通常情况下,发送状态应该在协议的应用层实现,而不是在传输层内部实现。 - morgwai

0

1
问题是关于处理PING而不是PONG。 - morgwai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接