#sockets #ftp #google-chrome-app
#сокеты #ftp #google-chrome-app
Вопрос:
Создание FTP-клиента как приложения Chrome с использованием chrome.sockets.tcp.
Сначала я продолжал получать «500 недопустимой команды: попробуйте быть более креативным» каждый раз, когда я пытался отправить пароль. Затем я понял, что он возвращает эту ошибку во второй команде, независимо от того, какую команду я отправлял.
Ie. USER, за которым следует PASS, выдаст мне ошибку. ПОДВИГ, за которым следует USER, выдаст мне ошибку. ПОДВИГ, за которым следует СПРАВКА, выдаст мне ошибку.
Я пробовал ждать интервал перед выдачей второй команды. безрезультатно.
chrome.app.window.create('index.html', {
id: "helloWorldID",
bounds: {
width: width,
height: height,
left: Math.round((screenWidth-width)/2),
top: Math.round((screenHeight-height)/2)
}
});
var IP = "server.com";
var PORT = 21;
var ftp_username = "user";
var ftp_password = "password";
var socketID;
function ab2str(buf) {
return String.fromCharCode.apply(null, new Uint8Array(buf));
}
function str2ab(str) {
var buf = new ArrayBuffer(str.length*2); // 2 bytes for each char
var bufView = new Uint8Array(buf);
for (var i=0, strLen=str.length; i<strLen; i ) {
bufView[i] = str.charCodeAt(i);
}
return buf;
}
function onCallback( result ){
console.log( "onCallback", result );
};
chrome.sockets.tcp.create({ persistent:false }, function(createInfo) {
socketID = createInfo.socketId;
chrome.sockets.tcp.connect( socketID, IP, PORT, onCallback);
});
chrome.sockets.tcp.onReceive.addListener(function(info) {
//console.log( "onReceive", info.socketId );
var d = ab2str( info.data );
console.log( d );
if (d.indexOf("220 ")>-1){
// send user.
console.log( "send " ftp_username);
chrome.sockets.tcp.send( socketID, str2ab("USER " ftp_username "n"), onCallback );
}
if (d.indexOf("331 ")>-1){
// send password.
console.log( "send password");
chrome.sockets.tcp.send( socketID, str2ab("PASS " ftp_password "n"), onCallback );
}
});
chrome.sockets.tcp.onReceiveError.addListener(function(info) {
console.log( "onReceiveError", info );
});
});
Комментарии:
1. Для чего нужен str2ab? Как насчет прямой передачи строки в send()?
2. str2ab преобразует строку в ArrayBuffer, который chrome.sockets.tcp.send ожидает в качестве 2-го параметра.
3. Почему вы резервируете два байта на символ в буфере массива? Попробуйте с одним.
4. @Danila это было так! Спасибо! можете ли вы опубликовать ответ, чтобы я мог его принять?
Ответ №1:
Вы должны зарезервировать 1 байт на символ в ArrayBuffer вместо двух
var buf = new ArrayBuffer(str.length); // 1 byte for each char
Ответ №2:
Возможно, вы захотите завершить строки для отправки, используя rn
только but n
.
Из RFC 959:
Протокол передачи файлов соответствует спецификациям протокола Telnet для всех соединений через управляющее соединение. Поскольку язык, используемый для связи по Telnet, может быть согласованным вариантом, все ссылки в следующих двух разделах будут относиться к «языку Telnet» и соответствующему «коду конца строки Telnet». В настоящее время можно считать, что это означает NVT-ASCII и <CRLF> . Никакие другие спецификации протокола Telnet не будут указаны.
Команды FTP — это «строки Telnet», завершающиеся «кодом конца строки Telnet». […]
Комментарии:
1. Я действительно пробовал это, спасибо. Это была одна из моих первых мыслей. К сожалению, это не сработало. Тот же результат, что и при использовании только n .