草庐IT

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

coder 2023-05-07 原文

关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。












想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。

3年前关闭。



Improve this question




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

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

  • TooTallNate/Java-WebSocket
    来自 GitHub 的描述:用 100% Java 编写的准系统 WebSocket 客户端和服务器实现。 http://java-websocket.org/
    -- 这个链接在my first result of googling "android websocket" .但是,它有很多 Unresolved 问题,尤其是关于 SSL 连接的问题,目前似乎没有得到积极维护。
  • koush/AndroidAsync
    来自 GitHub 的描述:用于 android 的异步套接字、http(客户端+服务器)、websocket 和 socket.io 库。基于 nio,而不是线程。
    -- 同样有许多 Unresolved 问题,但似乎已被积极维护/处理。
  • 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 是由 Autobahn 项目创建的 Java/Android 开源网络库,它实现了 WebSocket 协议(protocol)和 Web 应用消息协议(protocol) (WAMP),用于创建原生移动 WebSocket/WAMP 客户端。 -- cloudsurfin pointed out这不支持 wss。

  • 另外,还有一个原生socket.io安卓客户端库:
  • nkzawa/socket.io-client.java
    来自 GitHub 的描述:用于 Java 的全功能 Socket.IO 客户端库,与 Socket.IO v1.0 及更高版本兼容。

  • 使用 socket.io Android 客户端对我来说会很方便,因为无论如何我都计划将 nodejs/socket.io 用于 Web 前端。但是本地客户端还很年轻,并且有几个 Unresolved 问题。除此之外,我的理解是,Android 应用程序没有任何使用 socket.io 客户端库的好处(除了与 socket.io 1.0 服务器兼容),因为可以在客户端确保 WebSocket 支持.

    我的要求如下:
  • 与 Android API 9 及更高版本的兼容性
  • 可以通过 SSL 连接
  • 长时间保持连接而不必持有永久唤醒锁
  • 与可用的 nodejs websocket 服务器实现或 socket.io 的兼容性

  • 任何建议哪个是满足这些要求的正确库?

    最佳答案

    一些笔记。

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


  • 考虑点

    选择用 Java 编写的 WebSocket 客户端实现时的注意事项:
  • 合规 .不少实现没有实现closing handshake需要 RFC 6455 . (如果没有实现关闭握手会发生什么?见 this 。)
  • 所需的 Java 版本 . Java SE 5、6、7、8 还是 Java EE?即使在Android上也能用?
  • 尺寸 .一些实现有很多依赖。
  • wss 支持。
  • HTTP 代理 支持。
  • wss 通过 HTTP 代理 支持。参见 How HTML5 Web Sockets Interact With Proxy Servers 中的图 2关于 WebSocket 客户端库必须做什么才能通过 HTTP 代理支持 wss。
  • SSL 配置的灵活性 . SSLSocketFactorySSLContext应该能够在没有不必要限制的情况下使用。
  • opening handshake 中的自定义 HTTP header ,包括基本身份验证。
  • HTTP 代理协商中的自定义 HTTP header ,包括代理服务器上的身份验证。
  • 能够发送所有帧类型 (continuation, binary, text, close, ping and pong) 与否。大多数实现不为开发人员提供发送 fragmented frames 的方法和主动提供 pong frames手动。
  • 监听器接口(interface) 接收各种 WebSocket 事件。糟糕的界面让开发人员感到沮丧。丰富的界面可帮助开发人员编写健壮的应用程序。
  • 可以查询WebSocket状态与否。 RFC 6455定义了 CONNECTING、OPEN、CLOSING 和 CLOSED 状态,但很少有实现以定义的方式维护其内部状态转换。
  • 能够为套接字连接设置超时值 . (相当于 Socket.connect(SocketAddress endpoint, int timeout) 方法的第二个参数)
  • 能够访问底层原始套接字 .
  • 直观易用的 API 与否。
  • 有据可查 与否。
  • RFC 7692 (WebSocket 的压缩扩展)支持(又名 permessage-deflate)。
  • 重定向 (3xx) 支持。
  • 摘要认证支持。

  • nv-websocket-client 涵盖除最后两个之外的所有上述内容。此外,其小而方便的功能之一是定期发送 ping/pong 帧。只需拨打setPingInterval即可实现/setPongInterval方法(见 JavaDoc)。

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

    关于android - 在 Android 应用程序中使用哪个 WebSocket 库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30547517/

    有关android - 在 Android 应用程序中使用哪个 WebSocket 库?的更多相关文章

    1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

      我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

    2. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

      我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

    3. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

      类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

    4. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

      很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

    5. ruby - 在 Ruby 中使用匿名模块 - 2

      假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于

    6. ruby - 使用 ruby​​ 和 savon 的 SOAP 服务 - 2

      我正在尝试使用ruby​​和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我

    7. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

      我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

    8. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

      关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

    9. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

      我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

    10. ruby - 将差异补丁应用于字符串/文件 - 2

      对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

    随机推荐