2014-11-17 3 views
0

Я пытаюсь реализовать собственный 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); 
    } 
} 

ли вам есть идеи, что я делаю неправильно?

Спасибо заранее!

+0

Что происходит? – CodeCaster

+0

Клиент не может получить список файлов. Его ответ: время ожидания подключения. Но сокет данных открыт, и список действительно отправлен. –

ответ

1

Проблема заключалась в том, что сокет не был закрыт после отправки данных.

+0

Я искал ответ на вопрос, почему LIST не работал в моем случае часами. Моя реализация выполняется на C++, но логика такая же. Закрытие сокета теперь позволяет мне перечислить содержимое. Спасибо. –

 Смежные вопросы

  • Нет связанных вопросов^_^