在用户发送GET请求时,如何才能等待数据,直到它从TCP服务器的Node.js中接收到?

我想发送一个hello消息给基于C ++的服务器,一旦消息发送,端口“9090”侦听,服务器将做一些工作或任务,这将需要一些时间,所以我不想离开应用程序。得到(); function块,我怎么能做到这一点,直到从服务器获取数据,然后发回给用户作为回应?

基本上我想要的是不回复用户,留在循环中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中的套接字连接(像几乎所有的东西)是asynchronous的

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

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

    这意味着如果你在你的TCP客户端注册一个callback,然后发送HTTP响应,HTTP响应将被首先发送,并且你的callback将在稍后的时间点被调用。

  2. 没有必要使用while循环来轮询您的套接字; 只需使用tcp_client.on('data', ...)方法一次就可以注册一个callback函数,在从套接字读取数据后立即调用该函数。

    由于tcp_client.on(...)是asynchronous的,它将立即返回; 如果你这样做,你将基本上旋转不断,并不断注册新的事件监听器。 所以, 失去while(close_connection_flag == false)循环!

  3. 如果你想等待你的HTTP响应,直到你已经收到你的TCP套接字的数据,只需把你的res.end(...)调用放在 tcp_clientcallback中。

总而言之,我会build议这样的事情:

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

而不是将close_connection_flag设置为true,只需closures连接并返回给用户。 你在这里做的是在tcp_client上创build一个无限量的监听器的内存泄漏。

 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) { 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 (close_connection_flag) { tcp_client.destroy(); res.end('flag raised by server is: ' + flag_raised_by_server); } }); });