我想向基于 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 中是异步。
这有一些非常重要的后果:
调用
tcp_client.on('data', ...)
不会阻止您的程序执行,直到您收到一些数据。它会简单地注册一个回调函数,该函数将(可能)在稍后的某个时间点被调用,然后继续您的程序。这意味着,如果您在 TCP 客户端中注册回调,然后发送 HTTP 响应,则 HTTP 响应将先发送,您的回调将在稍后的某个时间点被调用。
无需使用 while 循环来轮询您的套接字;只需使用
tcp_client.on('data', ...)
方法一次 来注册一个回调函数,一旦从套接字中读取数据,该回调函数就会被调用。由于
tcp_client.on(...)
是异步的,会立即返回;如果你在一个循环中这样做,你基本上会无休止地旋转并不断注册新的事件监听器。所以,失去while(close_connection_flag == false)
循环!如果您想在 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/