【问题标题】:nodejs - how to write a client that connects to a nodeJS Server and receives broadcast messagenodejs - 如何编写连接到 nodeJS 服务器并接收广播消息的客户端
【发布时间】:2017-08-03 03:03:42
【问题描述】:

我有以下似乎工作正常的 nodeJS 服务器。我想写一个客户端,从服务器接收消息并根据消息调用一些JS。

涉及的步骤是:

  1. 用户访问网址http://server.xyz.com:8080/pa
  2. nodeJS 服务器接收到该调用并向连接的客户端广播 pa 是接收到的 api 调用。
  3. 连接到服务器的nod​​eJS客户端调用一些与pa动作相关的JS。

我的问题是:

1. How do I make sure the server broadcasts that message like Step 2?
2. How do I write a client that performs Step 3 above.

对于客户端,我看到很多对 socket.io 的引用,但我不确定在这种情况下最好的框架是什么。

server.js

var http = require('http');

http.createServer(function(request, response) {
  request.on('error', function(err) {
    console.error(err);
    response.statusCode = 400;
    response.end();
  });
  response.on('error', function(err) {
    console.error(err);
  });

  response.writeHead(200, {'Content-Type': 'application/json'});
  var body=[];
  if (request.method === 'GET' && request.url === '/pa') {
    response.end(JSON.stringify({"action": "pa"}));
  }
  else if (request.method === 'GET' && request.url === '/pi') {
    response.end(JSON.stringify({"action": "pi"}));
  }
   else {
    response.statusCode = 404;
    response.end();
  }
}).listen(8080);

【问题讨论】:

    标签: javascript node.js express websocket socket.io


    【解决方案1】:

    如果客户端也在 Node.js 中,那么您应该能够设置 webhook/push 服务。 Webhook 在当今的每个主要 API 中都使用,它们在 Slack 和 Microsoft 中非常普遍。以下内容受到 Microsoft 的 Office 365 pushstreaming 服务 API 的启发。

    添加一个客户端可以 POST 到的路由,我们称之为/subscribe。在/subscribe 路由的请求正文中,它们包含一个url,我们将其称为paReceiverUrl。

    如果客户端希望在其他人向/pa 端点发送消息时收到通知,客户端可以向/subscribe 端点发送请求,并在paReceiverUrl(以及任何其他信息,可能是一些身份验证数据)。为了安全起见,您应该将订阅客户的信息存储在非易失性存储中,让数据库为您执行此操作,或者直接将其写入文件,直到变得更复杂为止。

    现在您的 '/pa' 路线变得更像这样(您的第 2 步):

    if (request.method === 'GET' && request.url === '/pa') {
        // Send response to the request sender
        response.end(JSON.stringify({"action": "pa"}));
        // Get subscribed clients' information
        var subscribedClients = <Read from file or db>
        // Broadcast
        for(var i = 0; i < subscribedClientsUrls.length; i++) {
          // Send them a request at subscribedClients[i].paReceiverUrl
        }
    }
    

    现在对于您的第 3 步,客户端只需要让他们的服务器在他们的 paReceiverUrl 接受请求,然后他们就可以调用他们想要的任何 JS。

    如果您需要更实时,那么我会使用 Web 套接字协议来设置持久的 HTTP 连接以流式传输数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-06
      • 1970-01-01
      • 2016-07-26
      • 2022-01-25
      • 2017-11-17
      • 1970-01-01
      相关资源
      最近更新 更多