服务器到客户端的更新没有来自客户端的持续/持久请求Websocket编程
问题描述:
也许我没有完全理解相关问题中的答案。我得到了长轮询,反向AJAX的概念,但事情是这样的:服务器到客户端的更新没有来自客户端的持续/持久请求Websocket编程
我目前的设置是在我的本地单位,我是客户端,我是服务器。我可以成功建立到我的服务器的连接,并且一旦建立连接,我就可以向客户端发送一条消息,现在又出现了另一个场景,我只希望服务器在建立连接后不断更新客户端。为了简单起见,假设我希望我的客户端更新服务器时间,因此每当时间发生变化时,服务器会将最新时间发送给客户端(假设连接已建立)。
我正在使用node.js和socket.io。以下是我的代码:
客户:
<!DOCTYPE html>
<meta charset="utf-8" />
<title>WebSocket Testing</title>
<script src="/socket.io/socket.io.js"></script>
<script language="javascript" type="text/javascript">
var socket = new io.connect("http://127.0.0.1:8080");
socket.on('connect', function(){
// socket.on('news', function (data) {
// socket.emit('my other event', { my: 'data' });
socket.on("test",function(data){
alert(data);
});
socket.onmessage = function (event) {
console.log(event.data);
}
});
console.log(socket);
</script>
<h2>WebSocket Test</h2>
<div id="output"></div>
</html>
SERVER:
var socketOptions = {
transportOptions: {
'xhr-polling': {
closeTimeout: 20000000, //20 mins
timeout: 20000000 //20 mins
}
}
};
var app = require('http').createServer(handler)
, url = require('url')
, io = require('socket.io').listen(app,socketOptions)
, fs = require('fs')
app.listen(8080);
function handler (req, res) {
var path = url.parse(req.url).pathname;
fs.readFile(__dirname + '/index.html',
function (err, data) {
if (err) {
console.log("ERROR: "+err)
res.writeHead(500);
return res.end('Error loading index.html');
}
// res.writeHead(200);
//res.writeHead(200, {'Content-Type': path == 'json.js' ? 'text/javascript' : 'text/html'})
res.writeHead(200, {'Content-Type': 'text/html'});
console.log("THIS IS IT");
res.end(data);
});
}
console.log(io);
io.sockets.on('connection', function (socket) {
// socket.send("testing lang kung nagsesend");
// console.log("connection");
// socket.emit('news', { hello: 'world' });
// socket.on('my other event', function (data) {
// console.log(data);
// });
socket.emit("test","Test connection message established,send and received");
});
我该怎么做我的服务器代码?我可以注意到,几乎所有的代码示例都是使用php格式的。
答
使用函数在回调函数中创建一个setInterval,在connection
已被触发后,您希望它在数秒内完成设置。你正在寻找这样的事情:
io.sockets.on('connection', function (socket) {
setInterval(function(){
// do a socket emit here to give data to client
},1000);
}
它会设置每个连接从客户端后间隔。应该是在app.listen之后(8080); ? – 2013-02-21 08:45:18
是的,这也是可能的!但取决于你在找什么。此外,如果您使用此方法,请务必在断开连接事件后保持干净时删除间隔。 – GiveMeAllYourCats 2013-02-21 08:49:11
我认为,如果是这种情况,但是不会对我的服务器造成负担?如果场景是发生变化值的变化,我应该应用if..then语句的常规逻辑吗?也许我的问题是socket io是否具有连续向服务器提供数据的功能? “ – Charmie 2013-02-21 10:14:14