关于 java:我的 Websocket 需要永远连接

My Websocket takes forever to connect

更新
似乎在构造函数中的 org.glassfish.tyrus.core.BaseContainer 中,这两行运行速度超慢:

1
2
this.managedExecutorService = lookupManagedExecutorService();
this.managedScheduledExecutorService = lookupManagedScheduledExecutorService();

这两种方法的注释中提到 Android 有什么关系,我是否使用了针对桌面的错误 Java 代码?

我使用的代码完全来自:

Tyrus Websocket 文档:1.1.2 客户端端点

不知何故,连接需要大约 10 秒,特别是在我运行 Eclipse\\ 的调试器时的这一行:

1
ClientManager client = ClientManager.createClient();

会不会和这个有关?可能类似的堆栈溢出问题

我真的很迷茫,我觉得我是一个罕见的异类,试图将 websockets 与 Java 客户端结合使用,而不是使用 Javascript 浏览器。


所以问题的原因是 Tyrus 对 InitialContext 的初始化,以便在可用的情况下重用(预定的)执行器服务。通常,如果没有可用的,这会很快失败(并且这被记录为调试消息,请参见下文),但在这种情况下,它仅在尝试初始化无法工作的 INITIAL_CONTEXT_FACTORY 后才会失败。要覆盖此行为,请调用 System.setProperty(javax.naming.InitialContext.INITIAL_CONTEXT_FACTORY,"javax.naming.spi.InitialContextFactory")
在创建客户端之前。然后初始 InitialContext 将尝试创建接口的实例,这很快就会失败。

使用详细日志记录可能会更早发现问题。 Tyrus 不会做很多(调试)日志记录,但在这种情况下,使用 jul over logback 的设置可能会显示出潜在问题的早期迹象。作为一般规则:始终确保在遇到奇怪问题时可以查看跟踪/调试日志记录。

至于源代码中的Android注释:这只是注意到与"JDK8 compact2 profile"不兼容的平台,并通过不直接导入javax.naming.InitialContext类来解决(因为它显然不存在在 compact2 配置文件中)但使用反射代替(另见 TYRUS-242)。

如果您要创建纯 Java Websocket 客户端,请考虑使用 JDK 7 客户端。 JDK 7 客户端包 (org.glassfish.tyrus:tyrus-container-jdk-client:1.10) 比默认的 (org.glassfish.tyrus.bundles:tyrus-standalone-client:1.10) 要小得多。

当我开始将 websockets 与 Java 客户端一起使用时,我也觉得自己是个异类(我选择了 Jetty websocket 客户端 API 实现)。我也开始使用更多嵌入的 Tomcat(例如 basic-jsp-embed)。当结合这些技术时,您将获得一个强大的("全双工")网络解决方案(更类似于对等而不是客户端-服务器)。希望它会流行起来。
需要记住的一个警告是,一些防火墙会在 30 分钟后断开连接(看起来像 http 连接)(即使连接正在使用中)。因此,为了获得稳定的连接,请确保客户端定期发送 ping 消息以确保连接健康并在每 30 分钟内/每 30 分钟创建一个新连接。