FileZilla不会对来自我的java FTP服务器的命令做出反应

时间:2017-08-04 13:54:11

标签: java ftp

我编写自己的Java FTP服务器。直到最近我使用PUttY调试我的控制telnet连接,一切似乎都很好 - 我有成功的双向通信。现在我尝试使用FileZilla调试我的服务器,但它似乎没有读取我的文本,也没有发送到服务器,所以它只是挂起并等待一些东西。 控制连接类

public class ControlConnection extends Thread {
private enum OperationMode {
    ACTIVE, PASSIVE
}
private final Map<String, Supplier<String>> COMMANDS;
private String[] userTokens;

private User user;
private String userLogin;
private boolean authenticated;
private boolean dataConnected;
private boolean userExists;
private final Socket socket;
private DataInputStream inputStream;
private DataOutputStream outputStream;
private DataConnection ftpSession;
private OperationMode operationMode;
private String errorMessage;

public ControlConnection(Socket socket) {
    super(ControlConnection.class.toString());
    this.socket = socket;

    // constants initialization
    authenticated = false;
    dataConnected = false;

    // commands initialization
    COMMANDS = new HashMap<>();
    // commands init
}

@Override
public void run() {
    try {
        inputStream = new DataInputStream(socket.getInputStream());
        outputStream = new DataOutputStream(socket.getOutputStream());
        sendGreetings();
        IOProcessing.writeBytes(outputStream, pasvCommand());;
        boolean running = true;
        while (running) {
            sendGreetings();
            String input = IOProcessing.readBytes(inputStream);
            if (!(input.equals("")))
                System.out.println(input);
            if (!checkInput(input))
                continue;
            userTokens = input.split(" ");
            String command = userTokens[0].toUpperCase();
            String answer = COMMANDS.get(command).get();              
            outputStream.writeBytes(answer);
        }
    }
    catch (IOException e) {
        System.err.println(e);
        System.exit(-1);
    }
}
private boolean commonCheck() {
    // some checks
    return true;    
}
private String getErrorMessage() {
    return errorMessage;
}
public void sendGreetings() {
    String greetings = String.format("220 Control connection established: %s", getConnectionInfo());
    IOProcessing.writeBytes(outputStream, greetings);
}
public String getConnectionInfo() {
    String info = String.format("%s: %d %s",
            socket.getInetAddress().toString(), socket.getPort(), user != null ? user.getUsername(): "");
    return info;
}
// input/output proccessing functions
public boolean checkInput(String input) {
    // checks
    return true;
}

// commands functions
private String pasvCommand() {
    if (operationMode == OperationMode.PASSIVE) {
        errorMessage = "Already in passive mode.%n";
        return errorMessage;
    }
    String answer;
    new ListenToSocket().start();
    answer = String.format("227 Entering Passive Mode (%s, %d)",
        "127.0.0.1", DataConnection.PORT);
    operationMode = OperationMode.PASSIVE;
    return answer;
    }
private class ListenToSocket extends Thread {
    public ListenToSocket() {
    }

    @Override
    public void run() {
        try {
            ServerSocket ftpSocket =
                    new ServerSocket(DataConnection.PORT);
            ftpSession =
                    DataConnection.getDataConnection(ftpSocket.accept());
            if (ftpSession != null) {
                ftpSession.start();
                dataConnected = true;
                String greetings = "Data connection established: " + ftpSession.getConnectionInfo();
                IOProcessing.writeBytes(outputStream, greetings);
            } else {
                dataConnected = false;
            }
        } catch (IOException e) {
            System.out.print(e);
        }
    }
}

此外,服务器无法获取用户凭据,在FileZilla中输入 - 来自服务器的输入始终为空 IOProcessing类

public class IOProcessing {
private static final Charset UTF8_CHARSET;
static {
    UTF8_CHARSET = Charset.forName("UTF-8");
}

public static String readBytes(DataInputStream inputStream) {
    String result = "";
    try {
        int len = inputStream.available();
        if (len == 0) {
            return result;
        }
        byte[] byteInput = new byte[len];
        inputStream.readFully(byteInput, 0, len);
        result = new String(byteInput, "UTF-8").trim();
    } catch (IOException e) {
        System.err.println(e);
    }
    return result;
}

输出FileZlla日志 状态:解析localhost的地址 状态:正在连接[:: 1]:21 ... 状态:建立连接,等待欢迎消息。

1 个答案:

答案 0 :(得分:2)

您没有向我们展示writeBytes。所以我只能猜测在发送给客户端的消息之后你没有发送\r\n。特别是欢迎辞之后。所以FileZilla会一直等待它,就像任何FTP客户端一样。