Staram się pisać o kliencie ftp przeciwko Filezilli, który obsługuje tryb aktywny za pomocą node.js. Jestem nowy w ftp i node.js. Pomyślałem, że dzięki temu ćwiczeniu mogę uzyskać dobre zrozumienie komunikacji gniazd tcp i protokołu ftp. Ponadto, node-ftp i jsftp wydaje się nie obsługiwać trybu aktywnego, więc myślę, że będzie to miły (choć rzadko używany) dodatek do npm.Aktywny klient FTP dla Node.js
Mam kod dowodu z koncepcji, który działa co najmniej czasami, ale nie cały czas. W przypadku, gdy to działa, klient przesyła plik o nazwie file.txt
z tekstem "hi". Kiedy to działa, mam to:
220-FileZilla Server version 0.9.41 beta
220-written by Tim Kosse ([email protected])
220 Please visit http://sourceforge.net/projects/filezilla/
331 Password required for testuser
230 Logged on
listening
200 Port command successful
150 Opening data channel for file transfer.
server close
226 Transfer OK
half closed
closed
Process finished with exit code 0
Kiedy to nie działa, mam to:
220-FileZilla Server version 0.9.41 beta
220-written by Tim Kosse ([email protected])
220 Please visit http://sourceforge.net/projects/filezilla/
331 Password required for testuser
230 Logged on
listening
200 Port command successful
150 Opening data channel for file transfer.
server close
half closed
closed
Process finished with exit code 0
Więc ja nie dostaję 226, a nie jestem pewien dlaczego dostaję niespójne wyniki.
Przebacz źle napisany kod. Będę byłaby raz jestem pewien rozumiem, jak to powinno działać .:
var net = require('net'),
Socket = net.Socket;
var cmdSocket = new Socket();
cmdSocket.setEncoding('binary')
var server = undefined;
var port = 21;
var host = "localhost";
var user = "testuser";
var password = "Password1*"
var active = true;
var supplyUser = true;
var supplyPassword = true;
var supplyPassive = true;
var waitingForCommand = true;
var sendFile = true;
function onConnect(){
}
var str="";
function onData(chunk) {
console.log(chunk.toString('binary'));
//if ftp server return code = 220
if(supplyUser){
supplyUser = false;
_send('USER ' + user, function(){
});
}else if(supplyPassword){
supplyPassword = false;
_send('PASS ' + password, function(){
});
}
else if(supplyPassive){
supplyPassive = false;
if(active){
server = net.createServer(function(socket){
console.log('new connection');
socket.setKeepAlive(true, 5000);
socket.write('hi', function(){
console.log('write done');
})
socket.on('connect', function(){
console.log('socket connect');
});
socket.on('data', function(d){
console.log('socket data: ' + d);
});
socket.on('error', function(err){
console.log('socket error: ' + err);
});
socket.on('end', function() {
console.log('socket end');
});
socket.on('drain', function(){
console.log('socket drain');
});
socket.on('timeout', function(){
console.log('socket timeout');
});
socket.on('close', function(){
console.log('socket close');
});
});
server.on('error', function(e){
console.log(e);
});
server.on('close', function(){
console.log('server close');
});
server.listen(function(){
console.log('listening');
var address = server.address();
var port = address.port;
var p1 = Math.floor(port/256);
var p2 = port % 256;
_sendCommand('PORT 127,0,0,1,' + p1 + ',' + p2, function(){
});
});
}else{
_send('PASV', function(){
});
}
}
else if(sendFile){
sendFile = false;
_send('STOR file.txt', function(){
});
}
else if(waitingForCommand){
waitingForCommand = false;
cmdSocket.end(null, function(){
});
if(server)server.close(function(){});
}
}
function onEnd() {
console.log('half closed');
}
function onClose(){
console.log('closed');
}
cmdSocket.once('connect', onConnect);
cmdSocket.on('data', onData);
cmdSocket.on('end', onEnd);
cmdSocket.on('close', onClose);
cmdSocket.connect(port, host);
function _send(cmd, callback){
cmdSocket.write(cmd + '\r\n', 'binary', callback);
}
Również jest server
właściwe, albo zrobić to w jakiś inny sposób?
EDYTOWANIE: Zmieniono wywołanie zwrotne w pliku server.listen, aby użyć losowego portu. To usunęło wcześniej 425. Jednak nadal nie uzyskuję spójnego zachowania podczas przesyłania plików.
Czy sprawdziłeś ten? https://github.com/sergi/jsftp. – yeya