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

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


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



我使用的代码完全相同:

Tyrus Websocket Documentation: 1.1.2 Client Endpoint

以某种方式连接大约需要10秒钟,特别是在运行Eclipse的调试器时在此行:

ClientManager client = ClientManager.createClient();


可能与此有关吗? Potentially similar Stack Overflow Question

我真的迷失了,我觉得我尝试将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配置文件”不兼容,并且通过不直接导入javax.naming.InitialContext类得以解决(因为显然在compact2中不存在该类)配置文件),但改用反射(另请参见TYRUS-242)。

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

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

10-08 04:53