【问题标题】:Connecting to websocket using SocketChannel Android使用 SocketChannel Android 连接到 websocket
【发布时间】:2014-02-28 11:09:29
【问题描述】:

我编写了连接到 websocket 服务器的 android 应用程序、服务器应用程序和使用 Autobahn websocket 库实现的 android 应用程序。

我可以与服务器成功连接和交换消息。但一段时间后(20 - 30 分钟后)android 应用程序停止与服务器通信(它无法向服务器发送消息)。在 logcat 上显示应用程序仍然连接到 websocket,即使它无法向服务器发送消息。

我浏览了 Autobahn 库的源代码,发现它使用 java.nio.channels.SocketChannel 连接到 websocket。使用 SocketChannels 有什么问题吗? (我从这里Android - How to keep connection with server for a long time 发现了类似的问题)

【问题讨论】:

  • 它是如何失败的?您发送消息,而消息在另一端不可用?您使用的是什么类型的 SocketChannel(阻塞/非阻塞)?
  • 一段时间后,我无法从手机向服务器发送消息。是的,消息在另一边不可用。使用阻塞模式的高速公路库。这是高速公路库的源代码 - (github.com/tavendo/AutobahnAndroid/blob/master/Autobahn/src/de/…)
  • 可能是接收方处理数据的速度不够快。看看这里,它可能会有所帮助:jfarcand.wordpress.com/2006/05/30/…
  • 我已经解决了这个问题。下面是我的回答。谢谢。

标签: java android websocket socketchannel autobahn


【解决方案1】:

最后我通过使用 webscoket ping/pong 消息解决了这个问题。

其实问题不在于SocketChannel,我试过用普通的Socket代替SocketChannel。即使使用 Socket 也无法解决问题。

这是我用过的方法……

为了让 websocket 连接保持活跃,我们需要使用内置支持 websockt 协议的 Ping/Pong 消息(更多信息 websocket protocol)。服务器需要定期向客户端发送 ping 消息。当 ping 从服务器接收到时,客户端用 pong 消息回复它。使用这种方式,我们可以在 ling 时间内保持连接处于活动状态。

我用来构建我的 webscoket 客户端支持此 ping/pong 消息的 Autobahn 库。当通过 websocket 接收到 ping 消息时,库会自动将 pong 消息发送到服务器。所以我们无需担心手动发送 pong 消息。您可以从此处找到 ping/pong 消息的高速公路实现(在 createHandler() 方法中 - autobahn ping/pong implementation

您也可以从该主题Websockets. Loss of internet, keep-alive messages, app architecture etc获取有关此主题的更多详细信息

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-23
    • 1970-01-01
    • 1970-01-01
    • 2013-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多