微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

现在似乎有一堆用于Java的WebSocket库,我不确定应该使用哪一个

> TooTallNate/Java-WebSocket
GitHub的描述:用100%Java编写的准系统WebSocket客户端和服务器实现. http://java-websocket.org/
– 这个在my first result of googling “android websocket”链接.但是,它有很多未解决的问题,尤其是关于SSL连接的问题,目前似乎没有积极维护.
> koush/AndroidAsync
GitHub的描述:用于android的异步套接字,http(客户端服务器),websocket和socket.io库.基于nio,而不是线程.
– 许多公开问题,但似乎是维持/工作的活动.
> Project Tyrus
网站描述:JSR 356:用于WebSocket的Java API – 参考实现
– 这是由Oracle完成的.不确定它是否适用于Android.
> Jetty WebSocket Client API
来自网站的信息:Jetty还提供了一个Jetty WebSocket客户端库,可以更轻松地与WebSocket服务器进行通信.
– 再次:不确定它是否适用于Android.
> codebutler/android-websockets
GitHub的描述:适用于Android的裸网最小websockets(hybi13 / RFC)客户端
– 这个在schwiz/android-websocket-example中使用,这是StackOverflow问题“How to make the Android device hold a TCP connection to Internet without wake lock?”的可接受答案.
> Atmosphere/wasync
GitHub的描述:具有回退的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 module.作为mentioned by scorpiodawg,OkHttp自3.5版以来就内置了websocket支持.
> firebase/TubeSock
GitHub的描述:用Java实现的WebSocket客户端库
> Autobahn|Android(GitHub)
网站描述:Autobahn | Android是一个用于Java / Android的开源网络库,由Autobahn项目创建,该项目实现WebSocket协议和Web应用程序消息传递协议(WAMP),用于创建本机移动WebSocket / WAMP客户端. – cloudsurfin pointed out,这不支持wss.

此外,Android还有一个原生的socket.io客户端库:

> nkzawa/socket.io-client.java
GitHub的描述:适用于Java的全功能Socket.IO客户端库,与Socket.IO v1.0及更高版本兼容.

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

我的要求如下:

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

对于这些要求,哪一个是正确的库?

解决方法:

一些笔记.

> koush / AndroidAsync不执行RFC 6455所要求的closing handshake.有关详细信息,请参阅this.
> Project Tyrus适用于Android,但要确保其许可证(CDDL 1.1 and GPL 2 with CPE)及其大小(Reducing WebSocket client jar size with ProGuard)符合您的要求.另请注意,当文本大小很大时,Tyrus可能会抛出异常(这可能是一个错误).有关详情,请参阅this.
> Jetty:2年前email thread在jetty-users邮件列表中说“我们目前没有Android兼容的Jetty 9 WebSocket客户端.有计划尝试将Jetty WebSocket客户端从JDK 7反向移植到JDK 5/6 for android使用,但它的优先级低于完成JSR-356 Java WebSocket API(javax.websocket)的实现.“ Jetty目前关于其WebSocket Client API的document没有提到有关Android的任何内容.
> codebutler / android-websocket不执行RFC 6455所要求的closing handshake,并可能在关闭时抛出异常.见this.
> Atmosphere / wasync使用AsyncHttpClient / async-http-client作为其WebSocket实现.因此,应该提到AsyncHttpClient / async-http-client.
> firebase / TubeSock不验证Sec-WebSocket-Accept.这违反了RFC 6455.此外,TubeSock在构建短信时有一个错误.如果您对文本消息使用多字节UTF-8字符,您迟早会遇到该错误.有关TubeSock问题的详细列表,请参见delight-im/Android-DDP中的Issue 3.

考虑点

选择用Java编写的WebSocket客户端实现的注意事项:

>合规.不少于几个实现不实现RFC 6455所要求的closing handshake.(如果未实现结束握手会怎样?请参阅this.)
>必需的Java版本. Java SE 5,6,7,8或Java EE?甚至可以在Android上运行?
>尺寸.一些实现具有许多依赖性.
>支持.
> HTTP代理支持.
> wss over HTTP代理支持.请参阅How HTML5 Web Sockets Interact With Proxy Servers中的图2,了解WebSocket客户端库必须采取哪些措施来支持HTTP代理上的wss.
> SSL配置的灵活性.应该能够使用SSLSocketFactory和SSLContext而不受不必要的限制.
> opening handshake中的自定义HTTP标头,包括基本身份验证.
> HTTP代理协商中的自定义HTTP标头,包括代理服务器上的身份验证.
>能够发送所有帧类型(续,二进制,文本,关闭,ping和pong)或不发送.大多数实现不为开发人员提供手动发送fragmented frames和未经请求的pong frames方法.
>侦听器接口,用于接收各种WebSocket事件.糟糕的界面让开发人员感到沮丧.丰富的界面可帮助开发人员编写健壮的应
>能否查询WebSocket状态. RFC 6455定义了CONNECTING,OPEN,CLOSING和CLOSED状态,但很少有实现以定义的方式维持其内部状态转换.
>能够为套接字连接设置超时值. (相当于Socket.connect的第二个参数(SocketAddress endpoint,int timeout)方法)
>能够访问底层的原始套接字.
>直观易用的API或不.
>记录良好或不记录.
> RFC 7692(WebSocket的压缩扩展)支持(aka permessage-deflate).
>重定向(3xx)支持.
>摘要式身份验证支持.

nv-websocket-client涵盖了除上两个以外的所有内容.此外,它的一个小而方便的功能是定期发送ping / pong帧.它可以通过调用setPingInterval / setPongInterval方法来实现(参见JavaDoc).

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐