EDIT 2:
我使用服务器发送的事件(SSE)观察到相同的行为。请看这里的例子。(当然,这是单向的)。不过,在我的Nexus 5上,它似乎更健壮,也不会经常卡顿。而且它恢复/重新连接快。编辑1:
参见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时,插座。Io 似乎按"块"行事。如您所见,我的客户机/服务器执行一个"乒乓球"游戏,每隔1秒发出一条新消息。事实是,我正确地接收了~10个第一个消息(即I在10秒内从0增加到10),然后它阻塞了几秒钟,然后它继续传输。注意,我把页面放在手机的顶部,它没有进入pause state (?)
我的问题是:如何避免这种情况,以确保emit
将通过web套接字发送,只要它被调用?我是不是漏掉了什么。io设置?我忽略了一些关于web套接字,这种行为是正常的吗?
任何想法?
谢谢!
我会回答我自己的问题…
我尝试了websockets,甚至只有服务器到客户端通信和服务器发送的事件在我的手机上(Nexus 5与Lollipop 5.1和旧的LG p930与Gingerbread 2.3.5),它们都不能很好地使用这些技术。5点以后通讯中断了……10或60秒,但它总是中断。
我将使用AJAX进行重复查询。每0.5秒查询一次,我从未丢失过通信。这对我现在的项目来说足够了。
但是我很高兴看到SSE和/或websockets在Chrome 45/Android 5.1上工作。