javascript - 当用户发送 GET 请求时,我如何等待数据直到从 TCP 服务器在 Node.js 中接收到数据?

标签 javascript node.js sockets

我想向基于 C++ 的服务器发送一条问候消息,该服务器在发送消息后监听端口“9090”,服务器将执行一些需要一些时间的工作或任务,所以我不想离开 app.get();功能 block ,在从服务器获取数据然后作为响应发送回用户之前我该怎么做?

基本上我想要的是不回复用户,留在循环中 while(close_connection_flag == false) 直到它设置为 true 离开循环(直到我得到一个 tcp-reply 数据)然后离开循环并回复用户。

我的代码:

var net = require('net');
var tcp_client = new net.Socket();
var express = require('express');
var app = express();
var close_connection_flag = false;
var flag_raised_by_server = '';


app.get('/', function(req, res) {

  tcp_client.on('connect', function(){
    console.log('[+] Connected.');
    tcp_client.write('HelloServerSideFrom:Client-Server');
  });

  while(close_connection_flag == false) {

    tcp_client.on('data', function(data) {

      switch(data){

        case 'HelloClientServerFrom:Server':
          close_connection_flag = true;
          break;
        case 'data-success':
          close_connection_flag = true;
          flag_raised_by_server = 'ds';
          break;
        case 'data-failure':
          close_connection_flag = true;
          flag_raised_by_server = 'df';
          break
        default:
          // do nothing.
          break;     

      }

    });

  }

  res.end('flag raised by server is: ' + flag_raised_by_server);
  tcp_client.destroy();
});

注意:我在 Node.js 方面还是个新手,所以如果您能提供示例代码,请提供一些评论或解释,谢谢。

最佳答案

如果我没理解错的话,您希望在收到来自下游套接字服务器的响应后立即发送 HTTP 响应。

首先,要考虑的最重要的事情是:套接字连接——就像几乎所有东西一样——在 Node.JS 中是异步

这有一些非常重要的后果:

  1. 调用 tcp_client.on('data', ...) 不会阻止您的程序执行,直到您收到一些数据。它会简单地注册一个回调函数,该函数将(可能)在稍后的某个时间点被调用,然后继续您的程序。

    这意味着,如果您在 TCP 客户端中注册回调,然后发送 HTTP 响应,则 HTTP 响应将发送,您的回调将在稍后的某个时间点被调用。

  2. 无需使用 while 循环来轮询您的套接字;只需使用 tcp_client.on('data', ...) 方法一次 来注册一个回调函数,一旦从套接字中读取数据,该回调函数就会被调用。

    由于tcp_client.on(...)是异步的,会立即返回;如果你在一个循环中这样做,你基本上会无休止地旋转并不断注册新的事件监听器。所以,失去 while(close_connection_flag == false) 循环!

  3. 如果您想在 TCP 套接字上收到数据之前等待 HTTP 响应,只需将您的 res.end(...) 调用放在 tcp_client 回调。

总而言之,我建议是这样的:

app.get('/', function(req, res) {

  tcp_client.on('connect', function(){
    console.log('[+] Connected.');
    tcp_client.write('HelloServerSideFrom:Client-Server');
  });

  tcp_client.on('data', function(data) {
    var flag_raised_by_server;

    switch(data){

      case 'HelloClientServerFrom:Server':
        close_connection_flag = true;
        break;
      case 'data-success':
        close_connection_flag = true;
        flag_raised_by_server = 'ds';
        break;
      case 'data-failure':
        close_connection_flag = true;
        flag_raised_by_server = 'df';
        break
      default:
        // do nothing.
        break;     

    }

    if (flag_raised_by_server) {
      res.end('flag raised by server is: ' + flag_raised_by_server);
      tcp_client.destroy();
    }
  });
});

关于javascript - 当用户发送 GET 请求时,我如何等待数据直到从 TCP 服务器在 Node.js 中接收到数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34383299/

相关文章:

node.js - 如何为 Next.js API 请求进行 HTTP 代理

javascript - Nuxt.js + Auth(jwt 刷新 token )

java - 为4.0蓝牙传输创建一个socket

node.js - 在 Node.js 中将二进制数据读/写到 MongoDB

java - 检索插入数字的双倍——客户端服务器编程

c - 将多个 IP 地址匹配到一个端点

javascript - 从对象数组中获取日期的最大值

javascript - 在 Node.js 中顺序运行代码

javascript - knockout foreach嵌套问题

javascript - 如何根据用户在文本框中键入的内容更新标签文本