代码之家  ›  专栏  ›  技术社区  ›  garson

打开Websocket(“消息”)不工作

  •  2
  • garson  · 技术社区  · 6 年前

    我正在创建一个节点。js应用程序和使用服务器运行WebSocket。js文件和一个路由。js文件。我正在尝试使用这些路线。js文件在特定页面内发送消息,并最终将套接字消息定向到特定的websocket客户端。目前,我无法让on(“message”)功能正常工作。

    从服务器。js文件:

    require('./app/routes.js')(app, passport, wss); // load our routes and pass in our app and fully configured passport
    
    wss.on('connection', function connection(ws, req) {
                console.log('Client connected');
                ws.on('message', function incoming(message){
                    console.log("Incoming message: %s", message);
                })
                ws.on('close', () => console.log('Client disconnected'));
    })
            ;
    

    从路线上。js文件:

    app.post('/allbooks', function(
    
    req,res)
    {
        wss.clients.forEach((client) => {
        var arrayToSend = JSON.stringify([req.body.bookid, [], req.body.userSays]);
            console.log("Printing within routes.js");
            console.log(arrayToSend);
            client.send(arrayToSend);
        });
        res.redirect('/allbooks');    
    });
    

    当我发送消息时,我在日志中看到“Printing in routes.js”,但我没有看到来自服务器的“Incoming message”部分。js部分。为什么不呢?

    这里是脚本。我正在运行的页面中的js文件:

    var HOST = location.origin.replace(/^http/, 'ws')
      var ws = new WebSocket(HOST);
      ws.onmessage = function (event) {
        eventJSON = JSON.parse(event.data);
          if ($("#"+eventJSON[0]+"-request").length > 0){
            $("#"+eventJSON[0]+"-request").html("Message sent");
          }
        } 
    
    1 回复  |  直到 6 年前
        1
  •  7
  •   CatDadCode    6 年前

    我不知道 this 是你正在使用的软件包,但是你正在使用的任何软件包都是相似的。自述文件中有两个例子:

    服务器示例

    在服务器示例中,他们创建了一个web套接字服务器:

    const WebSocket = require('ws');
    
    const wss = new WebSocket.Server({ port: 8080 });
    
    wss.on('connection', function connection(ws) {
      ws.on('message', function incoming(message) {
        console.log('received: %s', message);
      });
    
      ws.send('hello from the server!');
    });
    

    这将创建监听套接字服务器。它添加了一个事件监听器 message 因此,当客户端连接到服务器时,该客户端可以发送消息,事件处理程序将启动。

    在该事件侦听器之后,它发送字符串 'hello from the server!' 。该发送调用不会触发上述事件处理程序,因为该发送调用发生在套接字的服务器端。它正在发送一条消息,以便在该套接字的客户端接收。

    客户端示例(通常在浏览器中)

    const WebSocket = require('ws'); // omit this line if including ws via <script> tag
    
    const ws = new WebSocket('ws://www.host.com/path');
    
    ws.on('open', function open() {
      ws.send('hello from the client!');
    });
    
    ws.on('message', function incoming(data) {
      console.log(data);
    });
    

    在第一个示例中,这是一个连接到套接字服务器的客户端脚本。它连接到 'connection' 事件将在上面的套接字服务器上引发。然后套接字服务器调用 ws.send('hello from the server!'); 我们的客户端脚本在这里为 'message' 所以它会启动并打印出来 “服务员您好!” 到浏览器控制台。

    这个客户端脚本还设置了一个 'open' 成功连接到套接字服务器后激发的事件处理程序。所以它会开火并发射 'hello from the client!' 到服务器。服务器的 “信息” 将启动,在服务器的终端中,您将看到 “客户您好!” 打印出来。


    在您的示例中,您是从服务器(您的服务器端routes.js文件)执行此操作的

    wss.clients.forEach(function each(client) {
      if (client.readyState === WebSocket.OPEN) {
        client.send(data);
      }
    });
    

    你在那里做的是迭代所有已成功连接到socket服务器的已连接客户端,并分别向每个客户端发送消息。这仍然会 启动服务器端 on 事件处理程序 “信息” 当每个插座第一次连接时,你就在每个插座上设置好了。它将在浏览器的客户端启动处理程序。


    根据您在上面的最后评论进行编辑:

    要想做你想做的事,你需要在客户机上做这样的事情:

    myButton.onClick = function (e) {
      ws.send("Hey everyone! I'm Chev!");
    };
    

    然后在连接处理程序中的服务器上设置如下消息处理程序:

    wss.on('connection', function connection(ws) {
      ws.on('message', function incoming(message) {
        wss.clients.forEach(function each(client) {
          if (client !== ws && client.readyState === WebSocket.OPEN) {
            client.send(message);
          }
        });
      });
    });
    

    你可以 消息 可以是一个对象而不是字符串,这样就可以根据该对象的属性执行不同的操作,但为了简单起见,我让服务器向服务器的其余部分广播它接收到的任何消息。

    请注意if语句检查,以确保我们不会将消息重新广播回发送消息的同一客户端。