Javascript 节点JS UDP数据报API在扩展时挂起

Javascript 节点JS UDP数据报API在扩展时挂起,javascript,node.js,asynchronous,udp,datagram,Javascript,Node.js,Asynchronous,Udp,Datagram,所以我是NodeJS的新手,我正在尝试通过现有的API进行移植。我正在使用的这个函数只是udp查询远程服务器并等待响应,但当我循环大量随机生成的查询时,很多查询开始超时 当我检查服务器日志时,我注意到并不是所有的查询请求都能通过。只有当我循环它几百次或更多次时才会发生这种情况,当它是一个较小的数字时很少发生 var dgram = require("dgram"); var randomstring = require("randomstring"); var xml2js = require(

所以我是NodeJS的新手,我正在尝试通过现有的API进行移植。我正在使用的这个函数只是udp查询远程服务器并等待响应,但当我循环大量随机生成的查询时,很多查询开始超时

当我检查服务器日志时,我注意到并不是所有的查询请求都能通过。只有当我循环它几百次或更多次时才会发生这种情况,当它是一个较小的数字时很少发生

var dgram = require("dgram");
var randomstring = require("randomstring");
var xml2js = require("xml2js");
var naTools = require("./NATools.js")

var ipVersion = 5;
var apiId = 7;

/**
 *
 * @param queryParamArray query params
 * @param callback function provided by user
 */
exports.queryServer = function(queryParamArray, callback) {
    //set socket type and query string
    var client = dgram.createSocket("udp4");
    var transactionId = randomstring.generate({
        length : 20,
        charset : "alphanumeric"
    });
    var queryString = queryParamArray[0] + ";" + queryParamArray[1] + ";" + queryParamArray[2] + ";" + ipVersion + ";" + apiId + ";" + transactionId + ";";
    var responseObject;
    var bufferMsg = new Buffer(queryString);

//if the request times out, close the client and call the callback function with the response
var timeoutObject = setTimeout(function() {
    client.close();
    responseObject = "Error : Request timed out after " + queryParamArray[4] + " milliseconds for transaction : " + transactionId;
    callback(responseObject);
}, queryParamArray[4]);

//parses the message received from the netacuity server and calls a function that generates the response objects and calls the callback function
client.on("message", function(message) {
    client.close();
    clearTimeout(timeoutObject);
    var msg = message.toString();
    var delimitedArray = msg.split(";");

    //find the transactionId section, followed by the error, and then the fields - sometimes netacuity server pads with an extra field
    var index = 0;
    while(delimitedArray[index] != transactionId && index<delimitedArray.length){
        index++;
    }

    if(index >= delimitedArray.length) {
        responseObject = "Error : transaction id from response does not match transaction id of request.";
        callback(responseObject);
        return;
    }

    if(delimitedArray[index+1] == '') { //make sure error field is empty
        var responseArray = delimitedArray.slice(index+2, delimitedArray.length-1);
        var paramArray = [queryParamArray[0], transactionId, queryParamArray[2]];
        naTools.generateResponseObject(paramArray, responseArray, callback);
    } else {
        responseObject = "Error : " + delimitedArray[index+1];
        callback(responseObject);
        return;
    }
});
//send the request
client.send(bufferMsg, 0, bufferMsg.length, 5400, queryParamArray[3], function() {
    console.log("Querying Server : " + queryString);
});
var dgram=require(“dgram”);
var randomstring=require(“randomstring”);
var xml2js=require(“xml2js”);
var naTools=require(“./naTools.js”)
var-ipVersion=5;
var-apid=7;
/**
*
*@param queryparam数组查询参数
*@param回调函数由用户提供
*/
exports.queryServer=函数(queryParamArray,回调){
//设置套接字类型和查询字符串
var client=dgram.createSocket(“udp4”);
var transactionId=randomstring.generate({
长度:20,
字符集:“字母数字”
});
var queryString=QUERYPARAMARY[0]+”;“+QUERYPARAMARY[1]+”;“+QUERYPARAMARY[2]+”;“+ipVersion+”;“+APID+”;“+transactionId+”;”;
var响应对象;
var bufferMsg=新缓冲区(queryString);
//如果请求超时,请关闭客户端并使用响应调用回调函数
var timeoutObject=setTimeout(函数(){
client.close();
responseObject=“Error:请求在事务“+transactionId;”的“+queryParamArray[4]+”毫秒后超时;
回调(responseObject);
},查询参数数组[4]);
//解析从NetCuity服务器接收的消息,并调用生成响应对象的函数并调用回调函数
client.on(“message”),函数(message){
client.close();
clearTimeout(timeoutObject);
var msg=message.toString();
var delimitedArray=msg.split(“;”);
//查找transactionId部分,后跟错误,然后查找字段-有时NetCuity server会添加一个额外字段
var指数=0;
while(delimitedArray[index]!=transactionId&&index=delimitedArray.length){
responseObject=“错误:响应中的事务id与请求的事务id不匹配。”;
回调(responseObject);
返回;
}
如果(delimitedArray[index+1]=''){//请确保错误字段为空
var responseArray=delimitedArray.slice(索引+2,delimitedArray.length-1);
var paramArray=[queryParamArray[0],transactionId,queryParamArray[2]];
generateResponseObject(paramArray、responseArray、回调);
}否则{
responseObject=“Error:”+delimitedArray[索引+1];
回调(responseObject);
返回;
}
});
//发送请求
send(bufferMsg,0,bufferMsg.length,5400,queryParamArray[3],function()){
log(“查询服务器:”+queryString);
});
}

naTools.generateResponseObject只是一个基于paramArray[0]的switch语句,它使用数据生成一个对象,并对其调用传入的回调函数

下面是测试用例:(假设所有必需的导入都在那里)

var数据库枚举={
xxx:3,
xxx:4,
xxx:5,
xxx:6,
xxx:7,
xxx:8,
xxx:9,
xxx:10,
xxx:11,
xxx:12,
xxx:14,
xxx:15,
xxx:17,
xxx:18,
xxx:19,
xxx:24,
xxx:25,
xxx:26
};
var incompleteIp=“2.242.71”//在这里放一些c类ip
var randomIp=不完全IP;
对于(var i=0;i<500;i++){//运行x测试查询
对于(var j=0;j<3;j++){
var randomNumber=j==0?Math.floor(Math.random()*3):Math.floor(Math.random()*6);
randomIp+=随机数;
}
var propertyList=Object.keys(数据库枚举);
var randomPropertyName=propertyList[Math.floor(Math.random()*propertyList.length)];
var randomFeatureCode=数据库枚举[randomPropertyName];
queryServer([randomFeatureCode,64,randomIp,“192.168.11.28”,20005400],函数(响应){
控制台日志(响应);
});
randomIp=不完全IP;
}

我不明白为什么有些查询不能到达服务器,当for循环超过300时超时?有时它会发生,有时它们都会完成。是不是我做错了什么阻止了事件循环

你得到答案了吗?结果是我正在ping的服务器。它根本不够快。你得到答案了吗?结果是我正在ping的服务器。只是速度不够快。
 var databaseEnums = {
 xxx             : 3,
 xxx             : 4,
 xxx             : 5,
 xxx             : 6,
 xxx             : 7,
 xxx             : 8,
 xxx             : 9,
 xxx             : 10,
 xxx             : 11,
 xxx             : 12,
 xxx             : 14,
 xxx             : 15,
 xxx             : 17,
 xxx             : 18,
 xxx             : 19,
 xxx             : 24,
 xxx             : 25,
 xxx             : 26
 };

var incompleteIp = "2.242.71."; //put some c class ip here
var randomIp = incompleteIp;
for(var i = 0; i < 500; i++) { //running x test queries
    for(var j = 0; j < 3; j++) {
        var randomNumber = j == 0 ? Math.floor(Math.random() * 3) : Math.floor(Math.random() * 6);
        randomIp += randomNumber;
    }
    var propertyList = Object.keys(databaseEnums);
    var randomPropertyName = propertyList[Math.floor(Math.random()*propertyList.length)];
    var randomFeatureCode = databaseEnums[randomPropertyName];
    api.queryServer([randomFeatureCode, 64, randomIp, "192.168.11.28", 2000, 5400], function(response) {
        console.log(response);
    });
    randomIp = incompleteIp;
}