EDIT 2:
我观察到使用相同的行为服务器发送的事件 (SSE)。参见示例here http://cjihrig.com/blog/server-sent-events-in-node-js/。 (当然,这是一种方式)。然而,它在我的 Nexus 5 上似乎更强大,并且不会经常滞后。它还可以快速恢复/重新连接。
EDIT 1:
也可以看看Websocket 间隔... https://stackoverflow.com/questions/18233636/websocket-interval-performance-problems-on-mobile-devices on SO.
我使用带有 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 时,套接字.io似乎是按“块”行事。如您所见,我的客户端/服务器执行“乒乓球”游戏,1 秒后发出一条新消息。事实是,我正确接收了大约 10 条第一条消息(即 i 在十秒内从 0 增加到 10),然后它阻塞几秒钟,然后恢复传输。请注意,我当然将顶部的页面保留在手机上,它不会进入pause状态 (?)
我的问题是:如何避免这种情况,以确保emit
一旦被调用就会通过网络套接字发送?我是否错过了 socket.io 设置的某些内容?我是否忽略了有关网络套接字的某些内容并且这种行为是正常的?
任何想法?
Thanks!