java - 如何从 Tyrus websocket 客户端获取本地 IP 地址

标签 java sockets websocket jetty tyrus

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

由于客户端可能会更改地址,因此每当它们(重新)连接到服务器时,都必须更新本地地址。使用 Jetty 的客户端可以轻松实现这一点,因为它的 Session类有一个 getLocalAddress()方法。

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

最佳答案

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

Jetty 比 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()它使用 javax.servlet.http.HttpUpgradeHandler ,它被赋予 javax.servlet.http.WebConnection通过容器。这两个对象都没有公开连接信息。

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

关于java - 如何从 Tyrus websocket 客户端获取本地 IP 地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34618820/

相关文章:

php - PHP Websockets服务器在256个用户后停止接受连接

c - 如何使用 C 程序读取和打印进入接口(interface)的 UDP 数据包的十六进制流?

ssl - 使用自签名证书保护 websockets

node.js - 将 socket.io 与 cordova 和 IOS 设备一起使用

Java Spring Boot 登录

java - Hibernate JPA 父子映射

java - 关闭套接字时不会抛出异常

带有 OpenSSL 签名证书的 PHP Websocket SSL Stunnel "bad certificate"

java - xmlPath 无法从 xml 中获取要列出的特定对象

java - 创建一个用于从 Java/Clojure 执行的 jar 文件