2016-12-29 2 views
1

Я пытаюсь создать ftpclient, который будет использовать только сокеты. Я делаю связь с сервером, но у меня нет идеи, как отображать файлы. Вот мой код:Java - Sockets - отображает имена всех файлов на сервере

package pl.edu.ftp; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.OutputStreamWriter; 
import java.net.Socket; 
import java.net.UnknownHostException; 
import java.util.*; 

import pl.edu.config.ConfigData; 

public class FTPProtocol { 
    private Socket socket; 
    private BufferedReader reader; 
    private OutputStreamWriter writer; 
    private Socket socket2; 
    private BufferedReader reader2; 
    private OutputStreamWriter writer2; 
    private String serverImportantOutput; 
    private boolean firstSocket = true; 

    public void makeConnection(ConfigData configData) throws UnknownHostException, IOException, InterruptedException { 
     socket = new Socket(configData.getServerAddress(), configData.getPort()); 
     reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
     writer = new OutputStreamWriter(socket.getOutputStream()); 

     (new Thread(new Runnable() { 
      public void run() { 
       try { 
        String line; 
        if (firstSocket == true) { 
         while ((line = reader.readLine()) != null) { 
          System.out.println("SERVER: " + line); 
          if (line.startsWith("227 Entering Passive Mode")) { 
           serverImportantOutput = line; 
          } 
         } 
        } else { 
         while ((line = reader.readLine()) != null) { 
          System.out.println("SERVER: " + line); 
         } 
        } 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     })).start(); 

     Thread.sleep(2000); 

     sendCommand("USER " + configData.getUsername()); 
     sendCommand("PASS " + configData.getPassword()); 
     sendCommand("SYST"); 
     sendCommand("FEAT"); 
     sendCommand("PWD"); 
     sendCommand("TYPE I"); 

     sendCommand("PWD"); 
     List<String> newData = sendCommandPasv("PASV"); 
     socket2 = new Socket(newData.get(0), Integer.parseInt(newData.get(1))); 
     reader2 = new BufferedReader(new InputStreamReader(socket2.getInputStream())); 
     writer2 = new OutputStreamWriter(socket2.getOutputStream()); 

     sendCommand2("LIST"); 
    } 

    private void sendCommand(String command) throws IOException, InterruptedException { 
     firstSocket = true; 

     writer.write(command + "\r\n"); 
     writer.flush(); 
     System.out.println("Client:" + command); 
     Thread.sleep(2000); 
    } 

    private void sendCommand2(String command) throws IOException, InterruptedException { 
     firstSocket = true; 
     writer2.write(command + "\r\n"); 
     writer2.flush(); 
     System.out.println("Client:" + command); 
     Thread.sleep(2000); 
     firstSocket = false; 
     Thread.sleep(2000); 
    } 

    private List<String> sendCommandPasv(String command) throws IOException, InterruptedException { 
     List<String> listOfStrings = new ArrayList<String>(); 

     writer.write(command + "\r\n"); 
     writer.flush(); 
     System.out.println("Client:" + command); 
     Thread.sleep(2000); 

     String fullAdress = serverImportantOutput.substring(serverImportantOutput.indexOf("(") + 1, 
       serverImportantOutput.indexOf(")")); 
     List<String> partsOfAdress = Arrays.asList(fullAdress.replaceAll("\\s+", "").split(",")); 

     String host = partsOfAdress.get(0) + "." + partsOfAdress.get(1) + "." + partsOfAdress.get(2) + "." 
       + partsOfAdress.get(3); 
     String port = Integer 
       .toString(Integer.parseInt(partsOfAdress.get(4)) * 256 + Integer.parseInt(partsOfAdress.get(5))); 

     System.out.println("Host: " + host); 
     System.out.println("Port: " + port); 

     listOfStrings.add(host); 
     listOfStrings.add(port); 

     return listOfStrings; 
    } 
} 

Я попытался использовать СПИСОК, NLST, MLSD, но все еще ничего не работает. В консоли у меня есть:

SERVER: 227 Entering Passive Mode (127,0,0,1,197,183) 
Host: 127.0.0.1 
Port: 50615 
Client:LIST 

И «Клиент: СПИСОК» Я должен ждать очень долго. После этого я получил:

SERVER: 421 Connection timed out. 

У кого-то есть, может быть, какая-то идея, что я делаю неправильно?


теперь я редактировал этот метод:

private void sendCommand2(String command) throws IOException, InterruptedException { 
     writer.write(command + "\r\n"); 
     writer.flush(); 
     System.out.println("Client:" + command); 
     firstSocket = false; 
     Thread.sleep(2000); 
    } 

И теперь, как результат у меня есть:

SERVER: 227 Entering Passive Mode (127,0,0,1,196,72) 
Host: 127.0.0.1 
Port: 50248 
Client:LIST 
SERVER: 150 Opening data channel for directory listing of "/" 
SERVER: 226 Successfully transferred "/" 

Но он по-прежнему не отображаются файлы.


Теперь я отредактировал, чтобы читать с читателя2, когда «bool firstSocket» является ложным. Поэтому он должен читать из «reader2» после отправки команды «LIST», но он все равно ничего не отображает.

(new Thread(new Runnable() { 
      public void run() { 
       try { 
        String line; 
        if (firstSocket == true) { 
         while ((line = reader.readLine()) != null) { 
          System.out.println("SERVER: " + line); 
          if (line.startsWith("227 Entering Passive Mode")) { 
           serverImportantOutput = line; 
          } 
         } 
        } else { 
         while ((line = reader2.readLine()) != null) { 
          System.out.println("SERVER: " + line); 
         } 
        } 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     })).start(); 

ответ

0

Вы можете попытаться подключиться к IP/порт вернулся в PASV ответ только после получения 1xx ответа на команду LIST.

Вы должны отправить команду LIST на основное (основное) соединение управления, а не на соединение с данными.

Прочтите RFC 959 для деталей.

+0

Я отредактировал мое сообщение. Теперь я посылаю команду «СПИСОК» в основное управляющее соединение. Но у меня все еще нет списка файлов. –

+0

Вы не читаете «читатель2», так что вы ожидаете? –

+0

Ах, я упустил это. Но он все еще не отображает никаких файлов:/Just: 'SERVER: 226 Успешно передано«/»SERVER: 421 Время ожидания подключения. –

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