【问题标题】:fire an event programatically every some seconds using socket.io使用 socket.io 每隔几秒以编程方式触发一个事件
【发布时间】:2022-02-08 13:09:37
【问题描述】:

我的服务器想每隔一段时间向客户端打个招呼。我有这个代码示例来演示根据时间间隔触发的事件。 但遗憾的是它不起作用。

服务器:

    var app = require('http').createServer(handler),
     io = require('socket.io').listen(app),
     fs = require('fs');


    app.listen(8001);



     function handler(req, res) {
     fs.readFile(__dirname + '/client1.html', function(err, data) {
      if (err) {
      console.log(err);
      res.writeHead(500);
      return res.end('Error loading client1.html');
    }
    res.writeHead(200);
      res.end(data);
    });
  }

  io.sockets.on('connection', function (socket) {
    console.log("runing time");

    socket.emit( "clientMessage","hi from server");
    socket.on('clientMessage', function () {
        socket.emit( "serverMessage","hi from server");
    });
    socket.on('disconnect', function () {
        console.log("disconnecting");
    });
  });

客户:

   <script src="/socket.io/socket.io.js"></script>

   <script>
   var socket = io.connect("http://localhost:8001");
   socket.on('connection', function(socket) {


       // *this line is not reached*
        alert("connected")

      sendTestMessage()

    socket.on("serverMessage", function(d) {
        alert("server Message : " + d)
    })
    socket.on('disconnect', function() {
        alert("disconnected")
    });

   });


   function sendTestMessage() {
    alert("test")
    socket.emit('clientMessage', "Test Message From Client");
    setTimeout(sendTestMessage(), 5000)
   }

  </script>

请帮忙看看为什么?

【问题讨论】:

  • 所以除了超时部分一切正常吗?如果是这样,请尝试使 socket 成为全局变量(只需删除它前面的 var )。我怀疑这可能是范围问题。当 setTimeout 执行函数时,它不知道“socket”是什么。还要确保你打开了开发者控制台,它会告诉你到底是什么问题。
  • 我试过你提到的,但它不起作用,控制台是空的,除了 XHR 完成加载:“localhost:8001/socket.io/1/?t=1394890934928
  • 我在 on("connection".... 范围内添加了 alert("connected") 但它也不起作用
  • 如果套接字正确连接到服务器,尝试setInterval而不是超时..

标签: javascript node.js websocket socket.io client-server


【解决方案1】:

我认为问题可能出在这里:

setTimeout(sendTestMessage(), 5000)

看起来您正在调用该函数,但只需要传递一个引用。

试试:

setTimeout(sendTestMessage, 5000);

【讨论】:

    【解决方案2】:

    服务器端和客户端的事件应该相同。 你应该试试这个 server.js:

    io.on('connection', function (socket) {
    console.log("runing time");
    
    setInterval(()=>{
    socket.emit("clientMessage","hi from server")
    }, 1000)
    
    socket.on('disconnect', function () {
        console.log("disconnecting");
    });
    

    client.js:

    socket.on('connect',()=>{console.log('socket connected')});
    
    socket.on('disconnect',()=>{console.log('socket disconnected')});
    
    socket.on('clientMessage', (msg)=>{
       console.log('Message From Server: ', msg)
    });
    

    这将每秒从服务器向客户端发送消息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-06
      • 1970-01-01
      相关资源
      最近更新 更多