Socket.IO 客户端在 3g/4g 连接上无法正常工作

Posted

技术标签:

【中文标题】Socket.IO 客户端在 3g/4g 连接上无法正常工作【英文标题】:Socket.IO Client doesn't work properly on 3g/4g connection 【发布时间】:2019-04-05 18:18:30 【问题描述】:

我一直在网上搜索我在 3g/4g 网络上使用 socketio 客户端时遇到的问题。好像可以连接,但连接不长,保持连接约60秒然后断开,当重连尝试事件触发时再次连接,但重复上述行为。

有谁知道为什么会发生这种情况或如何解决?

提前致谢!

这是我用来启动 de socket 的代码示例:

var socketOpts =  
                        reconnect: true,
                        reconnectionDelayMax : 2500,
                        timeout : 10000,
                        transport: ['polling','websocket']
                     ;

    socket = io.connect( $scope.socket_addr, socketOpts );

    showMessage( true, "Aguardando conexão com o servidor!", true );

    /* Abaixo estão os eventos que o Socket pode disparar durante o funcionamento do app */

    /* Quando o Socket conectar no servidor */
    socket.on("connect", function() 
    
        $scope.socket_connected = true;
        /* Agora que o socket já conectou, posso alterar o tempo de ping */
        socket.io.engine.pingInterval = 3000;
        socket.io.engine.pingTimeout = 5000;
        showMessage( false, "", false );
        console.log( "WS conectado" );
    );

【问题讨论】:

这就是移动连接的工作原理以及使用“偶尔连接”一词的原因。你总是会失去连接,因为你进入了电梯,一个盲区即使在城市,你的手机有断线问题,或者你搬到了房子的另一边。 不要尝试保持连接打开 感谢您的回复,但此代码属于 Cordova 应用程序,通常用于街道开阔的天空。它应该连接更多时间,不是吗?我的意思是,websocket 应该完全可以保持连接打开,还是我错了? @Fernando Rebêllo 我也注意到了同样的行为。每分钟都连接一个新的 socket.id。你找到解决方案了吗?它在 wifi 上运行良好……不是 LTE、4g…… @InêsGomes,我注意到套接字曾经关闭,因为当用户锁定屏幕时,操作系统正在休眠应用程序,所以我添加了一个 backgroundMode 插件以避免应用程序休眠,它消耗更多电池,但这对我来说不是问题。我还减少了到服务器的 ping 间隔,因此意识到连接消失并打开一个新连接需要更少的时间。希望对您有所帮助! 谢谢@Fernando Rebêllo。 :-) 我想我会尝试增加超时时间 【参考方案1】:

设置这些选项以延迟重新连接工作:-)

val opts = IO.Options()
opts.reconnection = true
opts.reconnectionDelay = 2000
opts.timeout = 60000
val socket = IO.socket(url, opts)

或者在离子中

socketConf: 
    url: 'http://your.Server.url',
    options:  reconnection: true, reconnectionDelay: 3000, timeout: 60000 
  

【讨论】:

嗨@InêsGomes,感谢您回答这些问题,虽然我的问题是android睡眠状态终止连接,但其他用户可能会因为这个时间而遇到这些问题。再次感谢您分享您的解决方案! 嗨@FernandoRebêllo 什么 backgroundMode 插件对你有用? 嗨@InêsGomes,我使用了katzer backgroundMode 插件,但是请记住,这个插件只适用于Android,实际上,它也适用于ios,但苹果出于某些技术原因拒绝发布。 github.com/katzer/cordova-plugin-background-mode希望对您有所帮助! 谢谢@FernandoRebêllo 我在使用该插件时遇到了很多问题。但是以github.com/irceline/aq-mobile-be/issues/… 和唤醒锁的方式解决了这个问题

以上是关于Socket.IO 客户端在 3g/4g 连接上无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

CFNetwork SSLHandshake 仅在 3G/4G 上失败(-9806)(不在 Wifi 上)

socket.io xhr 在慢速连接上发布错误(3G 移动网络)

连接插座io房间连接

socket.io不为人知的功能

Android 获取手机IP(3G/4G/WIFI/无网络)

Heroku - Socket.IO 客户端总是连接到本地主机