Javascript 当用户发送get请求时,如何等待数据在Node.js中从TCP服务器接收到? 我想发送一个hello消息给一个C++的服务器,它在端口9090上监听,一旦消息被发送,服务器将做一些工作或任务,需要一些时间,所以我不想离开App.GET();功能块,在从服务器获取数据并将其作为响应发送回用户之前,如何执行此操作
基本上,我想要的是不回复用户,在(close_connection_flag==false)处于循环内,直到它设置为true以离开循环(直到我获得tcp回复数据),然后离开循环并回复用户 我的守则如下:Javascript 当用户发送get请求时,如何等待数据在Node.js中从TCP服务器接收到? 我想发送一个hello消息给一个C++的服务器,它在端口9090上监听,一旦消息被发送,服务器将做一些工作或任务,需要一些时间,所以我不想离开App.GET();功能块,在从服务器获取数据并将其作为响应发送回用户之前,如何执行此操作,javascript,node.js,sockets,Javascript,Node.js,Sockets,基本上,我想要的是不回复用户,在(close_connection_flag==false)处于循环内,直到它设置为true以离开循环(直到我获得tcp回复数据),然后离开循环并回复用户 我的守则如下: var net = require('net'); var tcp_client = new net.Socket(); var express = require('express'); var app = express(); var close_connection_flag = fals
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\u client.on('data',…)
不会阻止程序执行,除非您收到一些数据。它将简单地注册一个回调函数,该函数将(可能)在稍后的某个时间点被调用,然后继续您的程序
这意味着,如果您在TCP客户机中注册回调,然后发送HTTP响应,HTTP响应将首先发送,回调将在稍后的某个时间点调用
无需使用while循环在套接字上进行轮询;只需使用tcp\u client.on('data',…)
方法一次就可以注册一个回调函数,从套接字读取数据后立即调用该函数
由于(…)上的tcp\u客户端是异步的,它将立即返回;如果在循环中这样做,基本上会无休止地旋转并不断注册新的事件侦听器。因此,在(close\u connection\u flag==false)
循环时丢失强>
如果您想等待HTTP响应,直到收到TCP套接字上的数据,只需将res.end(…)
调用放在TCP\u客户端
回调中即可
总而言之,我建议如下:
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\u connection\u flag
设置为true,只需在此处关闭连接并返回给用户即可。您在这里所做的是在tcp\u客户机上使用无限多的侦听器创建内存泄漏
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);
}
});
});
您不应该有一个tcp\u客户端。on('close')
事件吗?谢谢,可能就是这样。先生,我有一个问题,服务器引发的flag\u
变量是空的,我得到的响应是:服务器引发的flag是:
看起来服务器引发的flag\u
在开关盒块内没有初始化,为什么?在这种情况下,您可能需要检查TCP服务器实际响应的内容;尝试从回调中的console.log(data)
开始,查看服务器是否确实发送了预期的响应。此外,我还调整了代码示例,使其仅在实际设置了由\u服务器
引发的flag\u时发送HTTP响应。也许这也有帮助。是的,你是对的,我得到了tcp重新拷贝:啊,是的,这是一个原始字节缓冲区。您应该能够使用将其转换为常规字符串。