Javascript Node.js无法处理多条tcp消息
下面是一个简单的TCP服务器压力测试。只要我们每个客户端只发送一条消息,一切都会按预期工作。但当每个客户端发送两条消息时, 服务器突然停止,没有异常或错误。 那么这是一个bug还是一个特性Javascript Node.js无法处理多条tcp消息,javascript,node.js,sockets,tcp,Javascript,Node.js,Sockets,Tcp,下面是一个简单的TCP服务器压力测试。只要我们每个客户端只发送一条消息,一切都会按预期工作。但当每个客户端发送两条消息时, 服务器突然停止,没有异常或错误。 那么这是一个bug还是一个特性 var net = require("net"); var async = require("async"); var cluster = require("cluster"); // `ulimit -n` tells us that we can open max. 1024 files per pro
var net = require("net");
var async = require("async");
var cluster = require("cluster");
// `ulimit -n` tells us that we can open max. 1024 files per process.
// Creating a socket means opening a file so we are limited.
var CLIENTS = 1000;
// Here is the weird part:
// - sending one message per client works fine
// - sending multiple message per client sucks
var MESSAGES = 2;
var TOTAL = CLIENTS * MESSAGES;
var PORT = 1234;
var HOST = "127.0.0.1";
if (cluster.isMaster) {
var count = 0;
var start = new Date;
var server = net.createServer(function(socket) {
socket.on("data", function(data) {
var t;
count++;
console.log("server received " + count + " messages");
socket.write(data, function(err) { if (err) console.error(err); });
if (count === TOTAL) {
t = (new Date) - start;
console.log("server received and sent " + count + " messages within " + t + "ms");
}
});
});
server.listen(PORT, HOST, function() { cluster.fork(); });
} else {
var run = function(i) {
var c = net.connect({ port: PORT, host: HOST }, function() {
var tasks = (function() {
var results = [];
for (var x = 1; x <= MESSAGES; ++x) {
results.push((function(x) {
return function(next) { c.write("Hello server!", next); };
})(x));
}
return results;
})();
async.series(tasks, function(err) {
if (err) { console.error(err); }
});
});
};
for (var i = 1; i <= CLIENTS; ++i) { run(i); }
}
var net=require(“net”);
var async=require(“异步”);
var集群=需要(“集群”);
//'ulimit-n'告诉我们每个进程最多可以打开1024个文件。
//创建套接字意味着打开一个文件,因此我们受到限制。
var=1000;
//这里是奇怪的部分:
//-每个客户端发送一条消息可以正常工作
//-每个客户端发送多条消息很糟糕
var消息=2;
var TOTAL=客户端*消息;
var端口=1234;
var HOST=“127.0.0.1”;
if(cluster.isMaster){
var计数=0;
var开始=新日期;
var server=net.createServer(函数(套接字){
socket.on(“数据”),函数(数据){
变量t;
计数++;
log(“服务器收到”+count+“消息”);
socket.write(数据,函数(err){if(err)console.error(err);});
如果(计数==总数){
t=(新日期)-开始;
console.log(“服务器在“+t+”毫秒内接收和发送“+count+”消息”);
}
});
});
侦听(端口、主机、函数(){cluster.fork();});
}否则{
var run=函数(i){
var c=net.connect({port:port,host:host},function()){
var tasks=(函数(){
var结果=[];
对于(var x=1;x您假设从客户端调用.write
两次会触发服务器上的数据事件两次,而不考虑可能会合并多个写入的任何缓冲
调用对.write
的回调时,它并不意味着它实际发送的消息,而是意味着该消息被放入某个内核缓冲区(在发送到服务器时,该缓冲区可能包含多个消息).我如何确保消息被发送?好吧,我的错:一切正常,我只是忘记定义分隔符来识别消息的结束/开始。