如何从 Tyrus websocket 客户端获取本地 ip 地址

How to get the local ip address from a Tyrus websocket client

我正在编写一个 Java websocket 客户端,它需要知道自己的 IP 地址,这意味着 用于连接到服务器端点的接口的 IP 地址 .

由于客户端可能会更改地址,因此无论何时(重新)连接到服务器,都必须更新本地地址。这很容易使用 Jetty 的客户端实现,因为它的 Session class has a getLocalAddress() 方法。

Tyrus 的 session class 另一方面 没有这个能力 。一个简单的解决方法是使用普通的旧套接字。每当调用客户端的 onOpen 时,我只是打开一个到服务器的常规 TCP 套接字,获取套接字的本地地址,然后关闭它。但这是浪费且容易出错,所以我宁愿深入研究 Tyrus 并从其套接字获取本地地址。有办法吗?

Tyrus 是 JSR356 (javax.websocket) 的一个实现,因此,该级别的信息不可用。

Jetty pre-dates JSR356 和 Tyrus 大约 3 年,从 WebSocket 中学到了很多关于人们需要什么的知识。

你必须等到 javax.websocket 的 2.0 版,并祈祷它添加了这一级别的信息,然后你才能希望使用它。

Note: there's currently no plans or efforts underway for javax.websocket 2.0, the expert-group at the JSR has been inactive for over a year now.

您不太可能从 Tyrus 获得此信息,因为它依赖于容器的 javax.servlet.http.HttpServletRequest.upgrade() which uses a javax.servlet.http.HttpUpgradeHandler, which is handed a javax.servlet.http.WebConnection。这两个对象都没有公开连接信息。

Tyrus implementation of javax.servlet.http.HttpUpgradeHandler 甚至没有单独跟踪此信息以包含在 JSR356 层中。