【问题标题】:How to get the local ip address from a Tyrus websocket client如何从 Tyrus websocket 客户端获取本地 IP 地址
【发布时间】:2016-01-05 18:31:27
【问题描述】:

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

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

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

【问题讨论】:

    标签: java sockets websocket jetty tyrus


    【解决方案1】:

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

    Jetty 比 JSR356 和 Tyrus 早了大约 3 年,并且从 WebSocket 中了解到人们需要什么。

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

    注意:目前没有针对javax.websocket 2.0 的计划或努力,JSR 的专家组已经闲置一年多。

    您不太可能从 Tyrus 获得此信息,因为它依赖于使用 javax.servlet.http.HttpUpgradeHandler 的 javax.servlet.http.HttpServletRequest.upgrade(),而容器传递给 javax.servlet.http.WebConnection。这两个对象都没有暴露连接信息。

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

    【讨论】:

    • 谢谢。这是对为什么会出现这种情况的一个很好的解释,但我的问题围绕着“如何”。除了打开常规的第二个套接字之外,您还有其他解决方法可以建议吗?也许使用反射来挖掘 Tyrus 的内部结构?
    • JSR356 规范实际上只为最幼稚和最简单的 websocket 用例而设计。您的要求已经超出了这个范围。
    猜你喜欢
    • 2015-09-01
    • 2012-03-14
    • 2012-02-16
    • 2019-01-14
    • 1970-01-01
    • 2015-12-20
    • 2016-03-29
    • 1970-01-01
    • 2013-07-07
    相关资源
    最近更新 更多