【问题标题】:Server to client update without constant/persistent request from client Websocket programming服务器到客户端更新,无需来自客户端 Websocket 编程的持续/持久请求
【发布时间】:2013-02-06 11:55:19
【问题描述】:

也许我没有完全理解相关问题的答案。我得到了长轮询,反向 ajax 概念,但事情是这样的:

我当前的设置是在我的本地单元中,我是客户端,我是服务器。我可以成功地建立到我的服务器的连接,并且一旦建立连接,我就可以向我的客户端发送一条消息,现在另一个场景出现了,我只希望服务器在建立连接后不断更新我的客户端。为简单起见,假设我希望我的客户端使用服务器时间进行更新,因此每次分钟更改时,服务器都会将最新时间发送给客户端(前提是连接已经建立)。

我正在使用 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>

服务器:

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 格式的。

【问题讨论】:

    标签: php html node.js websocket


    【解决方案1】:

    connection 被触发后的几秒钟内,在回调中创建一个带有函数的 setInterval 您希望它执行的操作。你正在寻找这样的东西:

    io.sockets.on('connection', function (socket) {
        setInterval(function(){
            // do a socket emit here to give data to client
        },1000);
    }
    

    【讨论】:

    • 它将在客户端每次连接后设置间隔。应该是在 app.listen(8080); 之后吗? ?
    • 是的,这也是可能的!但取决于你在找什么。此外,如果您使用这种方法,请确保在断开连接事件被触发时删除间隔以保持干净。
    • 我也考虑过这一点,但如果是这样的话,我的服务器不会很重吗?如果场景发生了变量值的变化,我应该应用 if..then 语句的常规逻辑吗?也许我的问题是,socket io 是否具有向其服务器连续提供数据的功能?
    • "到它的服务器?"你是说客户吗?如果是这样,这可能是最好的方法(我不知道其他方法)。如果您希望所有客户端都具有相同的变量,请选择 @pawlakppp 的解决方案。唯一的区别是间隔设置一次,而不是为所有连接的客户端设置一次(更适合您的负载)
    • 嗨,我刚刚在一个长周末后回到我的办公桌前试了一下。我不知道这是否是一个好习惯,但感谢它就像魔术一样工作:) ...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多