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 后才会失败。要覆盖此行为,请调用
在创建客户端之前。然后初始 InitialContext 将尝试创建接口的实例,这很快就会失败。
使用详细日志记录可能会更早发现问题。 Tyrus 不会做很多(调试)日志记录,但在这种情况下,使用 jul over logback 的设置可能会显示出潜在问题的早期迹象。作为一般规则:始终确保在遇到奇怪问题时可以查看跟踪/调试日志记录。
至于源代码中的Android注释:这只是注意到与"JDK8 compact2 profile"不兼容的平台,并通过不直接导入
如果您要创建纯 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 分钟创建一个新连接。