我正在努力加快 Node.js 的发展速度,我一直在努力完成的一件事是模仿一个简单的文件传输代理,其中 Node 作为侦听服务器。这将需要节点侦听 tcp 套接字请求,然后接受二进制数据流并将其存储在系统中。
到目前为止,我所拥有的是,服务器仍然不存储任何东西,只是输出它接收到的数据,或者它应该。
服务器:
var net = require('net');
var fs = require('fs');
var buffer = require('buffer');
var server = net.createServer(function() {
console.log('server connected');
});
var HOST = '127.0.0.1';
var PORT = '9001'
var FILEPATH = '/home/steve/Downloads/';
server.listen(PORT, HOST, function() {
//listening
console.log('server bound to ' + PORT + '\n');
server.on('connection', function(){
console.log('connection made...\n')
})
server.on('data', function(data) {
console.log('data received');
console.log('data is: \n' + data);
});
});
Run Code Online (Sandbox Code Playgroud)
为了简单起见,我还在 Node 中编写了一个客户端的 hack。
客户:
var net = require('net');
var fs = require('fs');
var PORT = 9001;
var HOST = '127.0.0.1';
var FILEPATH = '/home/steve/Work/Node.js/FileTransfer/random.fil';
var client = new net.Socket()
//connect to the server
client.connect(PORT,HOST,function() {
'Client Connected to server'
//send a file to the server
var fileStream = fs.createReadStream(FILEPATH);
fileStream.on('error', function(err){
console.log(err);
})
fileStream.on('open',function() {
fileStream.pipe(client);
});
});
//handle closed
client.on('close', function() {
console.log('server closed connection')
});
client.on('error', function(err) {
console.log(err);
});
Run Code Online (Sandbox Code Playgroud)
当我运行它们时,我没有收到任何错误,但服务器只是创建服务器,接受连接然后关闭它。除此之外,我似乎无法弄清楚。此外,这是否是传输大文件的不错解决方案,在 ~1GB 范围内,还是 Node 根本不适合这样的事情?
TIA
我认为你在滥用服务器。当您调用 net.createServer 时,每次建立新连接时都会调用传递到那里的回调。传入的参数是您侦听数据事件的连接本身。我认为这更像是你想要的:
var net = require('net');
var fs = require('fs');
var buffer = require('buffer');
var server = net.createServer(function(conn) {
console.log('server connected');
conn.on('data', function(data) {
console.log('data received');
console.log('data is: \n' + data);
});
});
var HOST = '127.0.0.1';
var PORT = '9001'
var FILEPATH = '/home/steve/Downloads/';
server.listen(PORT, HOST, function() {
//listening
console.log('server bound to ' + PORT + '\n');
server.on('connection', function(){
console.log('connection made...\n')
})
});
Run Code Online (Sandbox Code Playgroud)
或者,您可以在服务器连接事件中执行此操作。这也传递了一个连接对象:
var net = require('net');
var fs = require('fs');
var buffer = require('buffer');
var server = net.createServer(function(conn) {
console.log('server connected');
});
var HOST = '127.0.0.1';
var PORT = '9001'
var FILEPATH = '/home/steve/Downloads/';
server.listen(PORT, HOST, function() {
//listening
console.log('server bound to ' + PORT + '\n');
server.on('connection', function(conn) {
console.log('connection made...\n')
conn.on('data', function(data) {
console.log('data received');
console.log('data is: \n' + data);
});
})
});
Run Code Online (Sandbox Code Playgroud)
关键是,您在连接上侦听数据,而不是在服务器本身上侦听数据。
| 归档时间: |
|
| 查看次数: |
11391 次 |
| 最近记录: |