node.js를 사용하여 활성 모드를 지원하는 Filezilla에 대한 FTP 클라이언트를 작성하고 있습니다. 나는 ftp와 node.js에 익숙하지 않다. 나는이 훈련을 통해 tcp 소켓 통신과 ftp 프로토콜을 잘 이해할 수 있다고 생각했다. 또한 node-ftpjsftp은 활성 모드를 지원하지 않는 것 같아서 npm에 추가하는 것이 좋을 것 같습니다.Node.js 용 활성 FTP 클라이언트
적어도 가끔은 작동하지만 일부 시간은 작동하지 않는다는 개념 증명 코드가 있습니다. 클라이언트가 작동하는 경우 클라이언트는 file.txt
이라는 텍스트를 'hi'라는 파일로 업로드합니다. 작동 할 때 ,이 얻을 :
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
,이 얻을 :
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
그래서, 나는 226을받지 못했습니다, 나는 확실하지 않다 왜 내가 일관성없는 결과를 얻고 있는지.
잘못 작성된 코드를 용서하십시오. 나는이 또한 :
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);
}
작동하는 방법을 이해하고 확신하면 나는, 적절한 server
입니다 리팩토링거야, 아니면 그것을 다른 방법으로해야합니까?
EDIT : 임의의 포트를 사용하도록 server.listen에서 콜백을 변경했습니다. 이것은 내가 이전에 얻었던 425 개를 제거했다. 그러나 여전히 파일 전송과 일관된 동작을 얻지 못하고 있습니다.
이 파일을 확인하셨습니까? https://github.com/sergi/jsftp. – yeya