nodejs - 如何编写连接到nodeJS Server并接收广播消息的客户端

时间:2017-03-13 06:43:29

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

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

所涉及的步骤是:

  1. 用户访问网址http://server.xyz.com:8080/pa
  2. nodeJS Server接收该呼叫并向已连接的客户端广播pa是收到的api呼叫。
  3. nodeJS连接到服务器的客户端调用与pa操作相关的一些JS。
  4. 我的问题是:

    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);
    

1 个答案:

答案 0 :(得分:0)

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

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

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

现在,您的paReceiverUrl路线变得更像这样(您的第2步):

'/pa'

现在,对于您的步骤3,客户只需要让他们的服务器接受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 } } 的请求,然后他们就可以调用他们想要的任何JS。

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