के लिए सक्रिय एफ़टीपी क्लाइंट मैं फाइलजीला के खिलाफ एक FTP क्लाइंट लिखने पर अपना हाथ कोशिश कर रहा हूं जो node.js. का उपयोग कर सक्रिय मोड का समर्थन करता है। मैं ftp और node.js. के लिए नया हूँ मैंने सोचा कि मैं इस अभ्यास करके टीसीपी सॉकेट संचार और एफटीपी प्रोटोकॉल की अच्छी समझ प्राप्त कर सकता हूं। इसके अलावा, node-ftp एक jsftp सक्रिय मोड का समर्थन नहीं करता है, इसलिए मुझे लगता है कि यह एक अच्छा (हालांकि शायद ही कभी इस्तेमाल किया जाएगा) एनपीएम के अलावा होगा।Node.js
मुझे अवधारणा कोड का कुछ सबूत मिला है जो कम से कम कभी-कभी काम करता है, लेकिन हर समय नहीं। जिस मामले में यह काम करता है, क्लाइंट 'हाय' टेक्स्ट के साथ file.txt
नामक फ़ाइल अपलोड करता है। जब यह काम करता है, मैं इस मिल:
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 नहीं मिल रहा है, और मुझे यकीन है कि नहीं कर रहा हूँ मुझे असंगत परिणाम क्यों मिल रहे हैं।
खराब लिखित कोड को क्षमा करें। मैं refactor जाएगा एक बार मुझे विश्वास है मैं समझता हूँ कि यह कैसे .:
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
उचित है, या मैं इसे किसी अन्य तरीके से करना चाहिए?
संपादित करें: मैंने यादृच्छिक बंदरगाह का उपयोग करने के लिए server.listen में कॉलबैक बदल दिया। इसने 425 को पहले हटा दिया था। हालांकि, मुझे अभी भी फ़ाइल स्थानांतरण के साथ लगातार व्यवहार नहीं मिल रहा है।
क्या आपने इसे देखा था? https://github.com/sergi/jsftp। – yeya