Я пытаюсь реализовать собственный ftp-сервер без каких-либо библиотек на Java. Для тестирования моего сервера я использую FTP-клиент FileZilla. Проблема в том, что я не могу отправить список файлов в текущем каталоге через подключение к данным (или, другими словами, я не могу реализовать FTP-команду LIST). Я пробовал как активный, так и пассивный режимы.Реализация собственного ftp-сервера: ответ на команду LIST
Вот выход FileZilla:
Command: PASV
Response: 227 Entering Passive Mode (192,168,0,87,125,63)
Command: LIST
Response: 150 Opening BINARY mode data connection.
// Here I'm trying to send list of files through data connection
Response: 226 Transfer complete.
Error: Connection timed out
Error: Failed to retrieve directory listing
Вот моя реализация команд LIST и PASV:
public class FTPCommandSocket implements Runnable {
Socket command_socket;
Socket data_socket = null;
FTPDataSocket ftpds = null;
ServerSocket ss = null;
// ...
@Override
public void run() {
try {
// Send response to the client.
sendResponse("220 WELCOME\n");
while(from_client_command.read(input_b) != -1)
{
String input = new String(input_b);
String cmd = parseInput(input);
switch(cmd) {
// ... (other commands)
case Command.PASV:
sendResponse("227 Entering Passive Mode (192,168,0,87,125,63)\n");
ss = new ServerSocket(125 * 256 + 63);
data_socket = ss.accept();
ftpds = new FTPDataSocket(data_socket);
break;
case Command.LIST:
sendResponse("150 Opening BINARY mode data connection.\n");
ftpds.sendFilesList(cur_path);
Thread.sleep(500);
sendResponse("226 Transfer complete.\n");
break;
//... (other commands)
default:
sendResponse("502 Command is not implemented.\n");
}
}
} catch (...) {}
}
private void sendResponse(String string) throws IOException {
to_client_command.write(string.getBytes());
to_client_command.flush();
}
}
Это класс подключения к данным:
public class FTPDataSocket {
Socket data_socket;
OutputStream to_client_data;
InputStream from_client_data;
private final byte[] input_b = new byte[15000];
public FTPDataSocket(Socket s) throws IOException {
this.data_socket = s;
from_client_data = data_socket.getInputStream();
to_client_data = data_socket.getOutputStream();
}
public void sendFilesList(String path) throws IOException {
// Debug version: there are no real files yet.
sendResponse("-rwxr-xr-x 1 100 100 14757 a.out\r\n");
}
private void sendResponse(String string) throws IOException {
to_client_data.write(string.getBytes());
to_client_data.flush();
System.out.print(string);
}
}
ли вам есть идеи, что я делаю неправильно?
Спасибо заранее!
Что происходит? – CodeCaster
Клиент не может получить список файлов. Его ответ: время ожидания подключения. Но сокет данных открыт, и список действительно отправлен. –