哪个WebSocket库在Android应用程序中使用?

我想添加一个服务到我的Android应用程序,它运行在后台持有WebSocket连接(可能超过几个小时甚至几天),并定期发送一些数据到服务器。

现在似乎有一堆Java的WebSocket库,我不知道我应该使用哪一个:

  • 来自GitHub的TooTallNate / Java-WebSocket描述:用100%Java编写的准系统WebSocket客户端和服务器实现。 http://java-websocket.org/ – 这个链接在我的第一个search结果“android websocket” 。 然而,它有一些悬而未决的问题,尤其是关于SSL连接的问题,目前似乎还没有得到积极的维护。

  • koush / AndroidAsync来自GitHub的描述: android的asynchronoussocket,http(client + server),websocket和socket.io库。 基于nio,不是线程。 – 还有许多公开的问题,但似乎维护/工作activiti。

  • Project Tyrus网站描述:JSR 356:WebSocket的Java API – 参考实现 – 这是由Oracle制作的。 不知道它是否在Android中起作用。

  • 来自网站的Jetty WebSocket客户端API信息:Jetty还提供了一个Jetty WebSocket客户端库来编写与WebSocket服务器的交谈更容易。 – 再次:不知道它是否在Android的作品。

  • codebutler / android-websockets来自GitHub的描述: Android的最低websockets(hybi13 / RFC)客户端 – 这一个用于schwiz / android-websocket-example ,这是StackOverflow接受的答案 – 问题“ 如何使Android设备持有TCP连接到Internet没有唤醒锁? “。

  • GitHub的Atmosphere / wasync描述:带有后备传输客户端库的WebSockets,用于Node.js,Android和Java http://async-io.org

  • TakahikoKawasaki / nv-websocket-client来自GitHub的描述:Java中的高质量WebSocket客户端实现。

  • square / okhttp来自GitHub的说明:适用于Android和Java应用程序的HTTP + SPDY客户端。 http://square.github.io/okhttp/ – 它有一个WebSocket模块 。 正如scorpiodawg所提到的 ,OkHttp从3.5版本开始就内置websocket支持。

  • 来自GitHub的firebase / TubeSock描述:用Java实现的WebSocket客户端库

  • Autobahn | Android ( GitHub )来自网站的描述:Autobahn | Android是一个由Autobahn项目创build的Java / Android的开源networking库,它实现了WebSocket协议和Web应用程序消息协议(WAMP),用于创build本地移动WebSocket / WAMP客户端。 – cloudsurfin指出 ,这不支持wss。

另外,还有一个适用于Android的原生socket.io客户端库:

  • nkzawa / socket.io-client.java来自GitHub的描述:function齐全的Socket.IO Client Library for Java,兼容Socket.IO v1.0及更高版本。

要使用socket.io Android客户端对我来说很方便,因为我打算使用nodejs / socket.io作为web前端。 但是本地客户很年轻,有几个公开的问题。 除此之外,我的理解是android应用程序没有使用socket.io客户端库(除了与socket.io 1.0服务器兼容)的任何好处,因为WebSocket支持可以在客户端保证。

我的要求如下:

  • 与Android API 9及更高版本兼容
  • 可以通过SSL连接
  • 保持连接很长一段时间,而不必持有永久性的wakelock
  • 与可用的nodejs websocket服务器实现或socket.io兼容

任何build议哪一个是正确的图书馆这些要求?

一些笔记。

  • koush / AndroidAsync不执行RFC 6455要求的closures握手 。 详情请参阅此 。

  • Tyrus项目在Android平台上运行,但要确保它的许可证( CDDL1.1和GPL2与CPE )及其大小( 使用ProGuard减lessWebSocket客户端jar大小 )符合您的要求。 还要注意,当文字大小很大的时候,Tyrus可能会抛出一个exception(这可能是一个错误)。 详情请参阅此 。

  • Jetty :一个2年前的邮件线程在jetty-users邮件列表中说: “我们目前没有Android兼容的Jetty 9 WebSocket客户端,有计划试图将Jetty WebSocket客户端从JDK 7移植到JDK 5/6 for android使用,但其优先级低于完成我们的JSR-356 Java WebSocket API(javax.websocket)的实现。 Jetty目前有关它的WebSocket客户端API的文档没有提到有关Android的任何内容。

  • codebutler / android-websocket不执行RFC 6455要求的closures握手 ,并可能在closures时抛出exception。 看到这个

  • Atmosphere / wasync使用AsyncHttpClient / async-http-client作为其WebSocket实现。 所以,应该提到AsyncHttpClient / async-http-client。

  • firebase / TubeSock不validationSec-WebSocket-Accept 。 这违反了RFC 6455 。 此外,TubeSock有一个错误在build立一条短信。 如果您使用多字节UTF-8字符作为短信,迟早会遇到该错误。 有关TubeSock问题的详细列表,请参阅delight-im / Android-DDP中的第3期 。

考虑点

在select用Java编写的WebSocket客户端实现时需要考虑的几点:

  1. 合规性 。 不less的实现不实现RFC 6455所要求的closures握手 。 (如果没有执行closures握手,会发生什么?请参阅此处 。
  2. 必需的Java版本 。 Java SE 5,6,7,8或Java EE? 即使在Android上工作?
  3. 大小 。 有些实现有很多依赖关系。
  4. wss支持。
  5. HTTP代理支持。
  6. 通过HTTP代理支持。 请参阅HTML5 Web套接字如何与代理服务器进行交互,以了解WebSocket客户端库如何支持wss over HTTP代理。
  7. 灵活的SSLconfiguration 。 应该能够使用SSLSocketFactorySSLContext而没有不必要的限制。
  8. 在开始的握手中定制HTTP标头 ,包括基本authentication。
  9. HTTP代理协商中的自定义HTTP头 ,包括代理服务器上的身份validation。
  10. 能够发送所有帧types (连续,二进制,文本,closures,乒乓和乒乓)或不。 大多数实现不为开发人员提供手动发送碎片帧和未经请求的 pong帧的方法 。
  11. 监听器接口接收各种WebSocket事件。 糟糕的界面让开发商感到沮丧。 丰富的界面可帮助开发人员编写健壮的应
  12. 能够查询WebSocket状态与否。 RFC 6455定义了CONNECTING,OPEN,CLOSING和CLOSED状态,但很less有实现以定义的方式维护其内部状态转换。
  13. 能够为套接字连接设置一个超时值 。 (相当于Socket. connect (SocketAddress endpoint, int timeout)方法的第二个参数)
  14. 能够访问底层原始套接字
  15. 直观易用的API或不。
  16. logging良好或没有。
  17. RFC 7692 (WebSocket的压缩扩展)支持(又名渗透压缩)。
  18. redirect (3xx)支持。
  19. 摘要authentication支持。

nv-websocket-client覆盖了除了最后两个之外的所有内容。 另外,它的一个小而方便的function是定期发送ping / pong帧。 它可以通过调用setPingInterval / setPongInterval方法来实现(请参阅JavaDoc )。

免责声明:Takahiko Kawasaki是nv-websocket-client的作者。

其他一些考虑:

Tyrus在Android上运行。 但是,它在Android 5.0中使用的SSL库存在bug,并且SSL握手失败 。 这应该在新版本的Android中得到修复,但是Android在许多设备上没有更新的方式,这可能是一个问题。

根据SSL如何实现其他websocket实现,这也可能是一个问题。

AndroidAsync没有这个SSL问题。 它确实有其他问题,如不能设置超时 。