Javascript 节点JS UDP数据报API在扩展时挂起
所以我是NodeJS的新手,我正在尝试通过现有的API进行移植。我正在使用的这个函数只是udp查询远程服务器并等待响应,但当我循环大量随机生成的查询时,很多查询开始超时 当我检查服务器日志时,我注意到并不是所有的查询请求都能通过。只有当我循环它几百次或更多次时才会发生这种情况,当它是一个较小的数字时很少发生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(
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;
}