我4小时前开始使用Node.js,我不确定非阻塞功能。
我在Node.JS中编写了一个服务器,他需要通过TCP处理C#中的许多客户端,我不希望客户端在从服务器得到答案之前等待5分钟。
我尝试使用2个客户端的代码,当第一个使用时,我尝试发送一个巨大的文件(看看第二个是否可以做一些请求),第二个尝试连接并且只接收id来表示建立的连接transfert之后(实际上在Visual Studio崩溃后,因为我的C#客户端在30秒后无法发送大文件而没有崩溃..)
我尝试使用sleep.sleep(5000)进行测试但是他跳过悬停所以我不知道如何测试是否阻止以及如何使其无阻塞
谢谢,抱歉我的英语很差,我说法语
这是我的服务器:
net = require('net');
fs = require('fs');
mysql = require('mysql');
var client = mysql.createConnection({
host : 'localhost',
user : 'root',
password : '*****',
database : 'test',
});
var clients = [];
function clientStruct()
{
this.id;
this.soc;
this.lastCommand;
}
var id = 0;
//?? Difference between Server and createServer
var s = net.createServer(function(socket) {
var client = new clientStruct();
client.id = id++;
client.soc = socket;
clients.push(client);
var stream = null;
socket.write(client.id + '\n');
socket.on('data', function(msg_sent)
{
var msg = msg_sent.toString().split(' ');
if (msg[0] == '-command')
{
client.lastCommand = null;
}
if (client.lastCommand == 'modifyProfilePic')
{
stream.write(msg_sent);
client.lastCommand = 'writeFile';
socket.write('0\n');
console.log('WRITE THE FILE');
sleep.sleep(5000);
console.log('sleep for 5 sec');
}
else if (client.lastCommand == 'writeFile')
{
if (msg_sent == '\n')
console.log('END');
else
stream.write(msg_sent);
//console.log(msg_sent.toString());
}
//FIRST ARGUMENTS
else if (msg[1] == 'mkuser')
{
socket.write('0\n');
client.lastCommand = msg[1];
}
else if (msg[1] == 'modifyProfilePic')
{
stream = fs.createWriteStream('test2.mp4', { flags : 'w' });
socket.write('0\n');
client.lastCommand = msg[1];
}
else
{
socket.write('1\n');
console.log('error');
client.lastCommand = null;
}
});
socket.on('end', function() {
var i = clients.indexOf(socket);
console.log('END of client ' + client.id + ' index ' + i + ' tab size ' + clients.length);
clients.splice(i, 1);
});
socket.on('error', function() {
var i = clients.indexOf(socket);
console.log('ERROR of client ' + client.id + ' index ' + i + ' tab size ' + clients.length);
clients.splice(i, 1);
});
});
var PORT = 10001
s.listen(PORT);
console.log('System waiting at localhost port:' + PORT)
答案 0 :(得分:1)
您的代码看起来很常见,但我认为您滥用stream
变量,我看到它被分配,在一行代码中,然后通过所有代码同步重用,没有回调来确定该块stream.write(...)
已成功撰写或未成功。
writable.write(chunk,[encoding],[callback])#
- chunk Buffer |要写的字符串数据
- encoding String可选。如果chunk是一个字符串,那么编码默认为'utf8'
- 回调功能可选。成功编写此块时调用。
- 返回布尔值
所以一段“异步”代码看起来像
stream.write(msg_sent,"ascii"/* or other encoding*/,function(){
console.log("File write success");
// continue code here.
});
请尝试阅读有关Streams
和fs.createWritableStream
。