【问题标题】:minimal java8 nio secure websocket client (wss)最小的 java8 nio 安全 websocket 客户端 (wss)
【发布时间】:2015-06-05 17:26:30
【问题描述】:

我花了相当长的时间寻找可以与 wss 一起使用且不会一团糟的简单 java websocket 客户端...

我试过https://github.com/TooTallNate/Java-WebSocket

在他描述时添加了依赖项,复制了 SSLClientExample.java 以使用 websocket.org 回显服务器对其进行测试,但在第 84 行出现编译错误 no such method setSocket()...(卡在这里)

我尝试了 tyrus(似乎这是一个由 oracle 直接开发的大型库),但似乎我需要运行一些 appserver(websocket 容器)才能使用它...

我想知道 websockets 有什么难的地方,以至于需要有 netty 或 glassfish 或 grizly 呢?

我认为它可以使用 SSLEngine (wss) 和纯 java sdk 来实现一个...关于 websockets 有什么我不知道的吗? (我想它很像普通的插座)

【问题讨论】:

    标签: java networking websocket java-8 tyrus


    【解决方案1】:

    GO for Java Webscoket API,简单优雅。

    【讨论】:

      【解决方案2】:

      nv-websocket-client 是一个用 Java 编写的新 WebSocket 客户端库。它支持 wss 并且只需要 Java SE 1.5,因此它甚至可以在 Android 上运行。

      nv-websocket-client-1.3.jar(2015-05-06 发布)的大小为 62,854 字节,不需要任何外部依赖。

      下面是一个“wss”示例。

      import com.neovisionaries.ws.client.*;
      
      public class HelloWSS
      {
          public static void main(String[] args) throws Exception
          {
              // Connect to "wss://echo.websocket.org" and send "Hello." to it.
              // When a response from the WebSocket server is received, the
              // WebSocket connection is closed.
              new WebSocketFactory()
                  .createSocket("wss://echo.websocket.org")
                  .addListener(new WebSocketAdapter() {
                      @Override
                      public void onTextMessage(WebSocket ws, String message) {
                          // Received a response. Print the received message.
                          System.out.println(message);
      
                          // Close the WebSocket connection.
                          ws.disconnect();
                      }
                  })
                  .connect()
                  .sendText("Hello.");
          }
      }
      

      博客
      WebSocket 客户端库(Java SE 1.5+,Android)
      http://darutk-oboegaki.blogspot.jp/2015/05/websocket-client-library-java-se-15.html

      GitHub
      https://github.com/TakahikoKawasaki/nv-websocket-client

      JavaDoc
      http://takahikokawasaki.github.io/nv-websocket-client/

      Maven

      <dependency>
          <groupId>com.neovisionaries</groupId>
          <artifactId>nv-websocket-client</artifactId>
          <version>1.3</version>
      </dependency>
      

      【讨论】:

      • 我将其添加为依赖项,但似乎它不在公共存储库中,您确定没有要添加的特定存储库吗? .connect() 也是阻塞调用吗?
      • 您可以在Maven Central Repository 中找到它。 connect() 方法阻塞,直到 WebSocket opening handshake 完成。握手成功后,会启动两个内部线程并返回 connect() 方法。发送和接收 WebSocket 帧是异步执行的。有关详细信息,请参阅博客、JavaDoc 或 README.md。
      • 刚试了一下,你的这个图书馆很棒,谢谢一百万!
      • 正在使用mvnrepository.com/artifact/javax.websocket/…,但一旦我移至安全套接字,它就会停止处理无法解释的错误。尝试了这个库,它第一次工作。干得好!
      • 确保您获得最新版本。目前已经比 1.3 更进一步,当前版本是 2.9
      【解决方案3】:

      试试 Matthias 的 simple-websocket-client。 (我只是他在 Twitter 上的追随者之一)你可能同意他对该项目的潜在意图。

      来自https://github.com/matzew/simple-websocket-client

      JSR 356 描述了 WebSocket 服务器和客户端的标准 API,但客户端 API 非常复杂。该项目旨在提供一个简化的客户端。

      顺便说一句,任何 WebSocket 客户端都不需要 WebSocket 服务器,并且可以在纯 Java SE 上编写自己的客户端。但是,由于易于与其他技术集成比简单性更重要,因此您可能会觉得有些潜在的上下文看起来很复杂且不必要。

      【讨论】:

      • 感谢您的链接,但据我所知,它不支持我需要的 wss 安全连接。
      【解决方案4】:

      Tyrus客户端不需要appserver! :)

      请参阅 Tyrus documentation 和博文 Reducing WebSocket client jar size with ProGuard(使用 JDK 7+ 可以降低到 500 kB)。

      关于大小 - 它可以进一步最小化,但在 Tyrus 代码中进行了一些重构。 WebSocket 和普通套接字的比较不是很准确——普通套接字不需要实现 HTTP,并且(传统上)没有 NIO 支持(Java 7 附带)。另一部分是 WebSocket 协议实现,这并不难,而且它不仅仅是将 byte[] 发送到线路 - 还有一些开放的握手、信号帧和强制的严格 UTF-8 编码/解码。

      所以我想你可以找到更简单的 API 实现,但坚持维护并作为 Java EE 一部分的东西对我来说似乎并不坏 - 你可以选择实现(Tyrus 只是其中之一,还有其他的),如果这种情况发生,您的客户端将准备好包含到 Java EE 应用程序中。 (编者注:我在 Tyrus 工作,所以我的回答很可能有偏见)。

      【讨论】:

      • 我喜欢 tyrus,毕竟它是由 oracle 人员维护的,谢谢你的链接,我会检查一下,然后尝试......如果它有效,我会在这里发布......我只需要wss 支持 websocket 客户端,没有任何码头网或任何鱼:)))
      • 您不需要设置 SSLContextConfigurator - 如果您的 JDK 配置正确,它将被自动拾取。 SslContextConfigurator 位于 org.glassfish.tyrus:tyrus-client 模块中(请使用相同的版本 - 在您的情况下为 1.10)。您还可以从“一体式独立捆绑包”中受益:org.glassfish.tyrus.bundles:tyrus-standalone-client-jdk; search.maven.org/….
      • 使用 -Djavax.net.debug=all 再次尝试客户端(请参阅docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/…).. 这应该可以帮助您了解信任库中缺少的内容。确保您在那里拥有完整的链 - 检查谁为 poloniex 等签署了证书。
      • 内存中的客户端/服务器对您没有帮助,它不会通过网络访问任何内容,它就是它的本质 - 内存传输,主要用于测试和性能评估。
      • 关于 java8 版本 - 目前只有这个:blogs.oracle.com/PavelBucek/entry/websocket_client_api_java_8,它还不是任何稳定版本的一部分。应该是 Tyrus 1.11 出来的时候,也许还有一些其他的扩展。
      猜你喜欢
      • 2017-09-20
      • 1970-01-01
      • 1970-01-01
      • 2013-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-06
      • 2019-12-19
      相关资源
      最近更新 更多