【发布时间】: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