【问题标题】:socket.io seems to be delayed on my Android phone我的 Android 手机上的 socket.io 似乎延迟了
【发布时间】:2015-12-12 11:15:30
【问题描述】:

编辑 2:

我使用 服务器发送事件 (SSE) 观察到了相同的行为。参见示例here。 (当然,这是一种方式)。但是,它在我的 Nexus 5 上似乎更强大,并且不会经常滞后。它还可以快速恢复/重新连接。


编辑 1:

另请参阅 SO 上的 Websocket interval...


我正在使用带有 Chrome 45 的 Nexus 5,通过路由器通过 wifi 与我的笔记本电脑通信。

我桌面上的服务器使用 node.js 版本 0.12.7 编码,我使用 socket.io 1.3.6。这是服务器的代码:

'use strict'
const app = require( 'express' )();

app.get( '/', function( req, res ){
    res.render( 'test_socketio_client.ejs' );
});

let httpServer = app.listen( 8000 );

const io = require( 'socket.io' )( httpServer );
let i = 0;

io.on( 'connection', function( socket ){
    socket.on( 'req', function( data ){
        console.log( data );
        socket.emit( 'res', {res:'From server', i:i.toString()} );
        ++i;
    });
});

这是我的客户的代码:

<html>
<head>
    <meta charset="utf-8"/>
    <title>Test Socket.io</title>
</head>
<body>
    <h1>Test Socket.io</h1>
    <hr/>
    <p>From server: <span id="test1"></span></p>

    <script src="//code.jquery.com/jquery-1.11.3.min.js"></script>
    <script src="/socket.io/socket.io.js"></script>
    <script>
        var socket = io();
        var i = 0;

        var f = function(){
                socket.emit( 'req', {req:'From client', 
                    i:i.toString()} );
            };

        socket.on( 'res', function( data ){
            $("#test1").html( data.i );
            ++i;
            setTimeout( f, 1000 );
        });

        f();

    </script>

</body>
</html>

如果我在桌面上使用http://localhost:8000 浏览器没有问题,但是当我通过我的家庭 wifi 网络使用我的 Nexus 5/Chrome 45 时,socket.io 的行为似乎是“块”。如您所见,我的客户端/服务器执行“乒乓”游戏,1 秒后发出一条新消息。事实是我正确接收到了大约 10 条第一条消息(即我在 10 秒内从 0 增加到 10)然后它阻塞了几秒钟,然后它恢复传输。请注意,我当然保留手机顶部的页面,它不会进入 pause 状态 (?)

我的问题是:如何避免这种情况,以确保在调用emit 后立即通过网络套接字发送它?我是否错过了 socket.io 设置的某些内容?我是否忽略了有关 web 套接字的某些内容并且这种行为是正常的?

有什么想法吗?

谢谢!

【问题讨论】:

  • 好吧,我有一个由套接字远程控制的移动音乐应用程序,是的,有时我会单击 next(),等待,然后再次单击 3 或 4 次,然后没有任何反应,然后几秒钟后,它向前跳了 4 首曲目。我不知道是电话、电源管理、wifi、路由器还是其他什么,但移动 websocket 似乎并不像台式机那样总是打开和准备就绪。我确实收到了消息,它们只是停止并聚集而不是平滑地流出,因为它们是由服务器发出()的......哦,我也没有使用 socket.io......
  • @dandavis 感谢您的信息。也许有人对一些设置有想法?
  • 请记住,SSE 使用 HTTP 而不是套接字。关于套接字 - 还要记住,浏览器在手机上的实现是非常不同的,而且 websocket 在不同的手机上一直是一种问题。在线搜索一些具有实现级别和稳定性的图表。还可以在手机上启用调试并在您发出时开始记录带时间戳的事件,这样您就可以确定延迟事情不是浏览器的错。
  • @AndreyPopov 感谢您的提示。好吧,我看到了 SSE 和 websocket 之间的区别。其实我想用web sockets来让服务器通知浏览器,让浏览器通知服务器。但我认为如果这些在移动设备上更稳定,我会选择 SSE/AJAX。
  • @AndreyPopov 当然会很好! :-) 但是我的工作比理论更实用,我必须找到其他方法来实现我的目标。我只是让移动设备无法(可能是设计使然)通过 wifi 长时间保持套接字连接???

标签: javascript node.js websocket socket.io wifi


【解决方案1】:

我会回答我自己的问题...

我在我的手机(带有 Lollipop 5.1 的 Nexus 5 和旧的 LG p930使用 Gingerbread 2.3.5) 并且它们都不能与这些技术一起正常工作。通信在 5 ... 10 或 60 秒后中断,但总是中断。

我将使用 AJAX 处理重复查询。每 0.5 秒查询一次,我从未丢失过通信。这对我目前的项目来说已经足够了。

但我希望看到 SSE 和/或 websockets 在 Chrome 45/Android 5.1 上运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-02
    • 2020-03-07
    • 2021-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多