Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 当用户发送get请求时,如何等待数据在Node.js中从TCP服务器接收到? 我想发送一个hello消息给一个C++的服务器,它在端口9090上监听,一旦消息被发送,服务器将做一些工作或任务,需要一些时间,所以我不想离开App.GET();功能块,在从服务器获取数据并将其作为响应发送回用户之前,如何执行此操作_Javascript_Node.js_Sockets - Fatal编程技术网

Javascript 当用户发送get请求时,如何等待数据在Node.js中从TCP服务器接收到? 我想发送一个hello消息给一个C++的服务器,它在端口9090上监听,一旦消息被发送,服务器将做一些工作或任务,需要一些时间,所以我不想离开App.GET();功能块,在从服务器获取数据并将其作为响应发送回用户之前,如何执行此操作

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

基本上,我想要的是不回复用户,在(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 = 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重新拷贝:啊,是的,这是一个原始字节缓冲区。您应该能够使用将其转换为常规字符串。