Java 获得;501语法错误";向FTP服务器发出RETR命令时

Java 获得;501语法错误";向FTP服务器发出RETR命令时,java,ftp,Java,Ftp,我制作了一个FTP客户端,它有RETR和LIST命令,但遇到了一个问题。在执行RETR命令后,我不断收到以下错误: 1:220-FileZilla服务器版本0.9.50 beta 1:220-由Tim Kosse(Tim。kosse@filezilla-(project.org) 1:220请访问https://filezilla-project.org/ 2331极客需要密码 3230已登录 5227进入被动模式(127,0,0,1217137) 6200类型设置为A 7150为“/”目录列表

我制作了一个FTP客户端,它有
RETR
LIST
命令,但遇到了一个问题。在执行
RETR
命令后,我不断收到以下错误:

1:220-FileZilla服务器版本0.9.50 beta
1:220-由Tim Kosse(Tim。kosse@filezilla-(project.org)
1:220请访问https://filezilla-project.org/
2331极客需要密码
3230已登录
5227进入被动模式(127,0,0,1217137)
6200类型设置为A
7150为“/”目录列表打开数据通道
5227进入被动模式(127,0,0,1217139)
150为“/”目录列表打开数据通道
8501语法错误
线程“main”java.net.ConnectException:连接被拒绝:连接
位于java.net.DualStackPlainSocketImpl.connect0(本机方法)
位于java.net.DualStackPlainSocketImpl.socketConnect(未知源)
位于java.net.AbstractPlainSocketImpl.doConnect(未知源)
位于java.net.AbstractPlainSocketImpl.connectToAddress(未知源)
位于java.net.AbstractPlainSocketImpl.connect(未知源)
位于java.net.PlainSocketImpl.connect(未知源)
位于java.net.socksocketimpl.connect(未知源)
位于java.net.Socket.connect(未知源)
位于java.net.Socket.connect(未知源)
位于java.net.Socket。(未知源)
位于java.net.Socket。(未知源)
在ftp.ftp.connect(ftp.java:135)
位于ftp.test.main(test.java:12)
此外,在我执行
RETR
命令后,客户机停止发出
LIST
命令;它不知道文件夹中有哪些文件

public class ftp{
public synchronized void connect(String host, int port, String user,
        String pass) throws IOException {
    Socket socket = new Socket(host, port);

    BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    BufferedWriter writer = new BufferedWriter(
            new OutputStreamWriter(socket.getOutputStream()));


    String response = reader.readLine();

    if (!response.startsWith("220-")) {
        throw new IOException(
                "FTP modtog et ukendt svar, da den blev forbundet til FTP server: "
                        + response);
    } else {System.out.println("1:"+response);
    response = reader.readLine();
    System.out.println("1:"+response);
    response = reader.readLine();
    System.out.println("1:"+response);


    }
    writer.write("user geek"+"\r\n");
    writer.flush();
    response= reader.readLine();
    System.out.println("2"+response);

    writer.write("PASS hello" +"\r\n");
    writer.flush();
    response= reader.readLine();
    System.out.println("3"+response);



    writer.write("pasv"+"\r\n");
    writer.flush();
    response= reader.readLine();
    System.out.println("5"+response );
    String [] r=response.trim().split(",");

    String reg=r[4];
    String add= r[5].replace(")", "");
    int m = Integer.parseInt(reg);
    int a = Integer.parseInt(add);

    int port1 = m*256+a;

    Socket datasocket = new Socket("127.0.0.1", port1);
    writer.write("type A\r\n");
    writer.flush();
    response= reader.readLine();
    System.out.println("6"+response);
    BufferedReader reader2 = new BufferedReader(new InputStreamReader(datasocket.getInputStream()));


    writer.write("LIST\r\n");
    writer.flush();
    response = reader.readLine();
    System.out.println("7" + response);

    List<String> files = new ArrayList<>();
    String text;
    while ((text = reader2.readLine()) != null) {
        String filename = parseFilename(text);
        files.add(filename);
    }
    reader2.close();
    datasocket.close();
    reader.readLine();

    for (String file : files) {
        int passivePort = getPort(reader, writer);
        writer.write("RETR\r\n");
        writer.flush();
        System.out.println(response);
        byte[] mybytearray = new byte[1024];

        try (Socket filesocket = new Socket("localhost", passivePort);
                InputStream is = filesocket.getInputStream();
                FileOutputStream fos = new FileOutputStream("c:/Users/Username/Desktop/FTP/" + file)) {
            int count;
            while ((count = is.read(mybytearray)) >= 0) {
                fos.write(mybytearray, 0, count);
            }
        }
    }

                writer.write("RETR\r\n");
            writer.flush();
            response= reader.readLine();
            System.out.println("8"+response);

                Socket filsocket = new Socket ("localhost", port1);
                InputStream is = null;
                FileOutputStream fos = null;

                byte[] mybytearray = new byte[1024];
            try {
                    is = filsocket.getInputStream();
                    fos = new FileOutputStream("myfile.txt");

                    int count;
                    while ((count = is.read(mybytearray)) >= 0) {
                        fos.write(mybytearray, 0, count);
                    }
                } finally {
                fos.close();
                    is.close();
                filsocket.close();
            }

}

private String parseFilename(String text) {

    return "abc.txt";
}

private int getPort(BufferedReader reader, BufferedWriter writer) throws IOException { //this is line 135
    String response;
    writer.write("PASV" + "\r\n");
    writer.flush();
    response = reader.readLine();
    System.out.println("5" + response);
    String[] r = response.trim().split(",");

    String reg = r[4];
    String add = r[5].replace(")", "");
    int m = Integer.parseInt(reg);
    int a = Integer.parseInt(add);

    return m * 256 + a;
}


}       
公共类ftp{
公共同步的void connect(字符串主机、int端口、字符串用户、,
字符串传递)抛出IOException{
套接字=新的套接字(主机、端口);
BufferedReader=新的BufferedReader(新的InputStreamReader(socket.getInputStream());
BufferedWriter=新的BufferedWriter(
新的OutputStreamWriter(socket.getOutputStream());
字符串响应=reader.readLine();
如果(!response.startsWith(“220-”){
抛出新IOException(
FTP模式和ukendt svar,直到FTP服务器:
+反应);
}else{System.out.println(“1:+响应”);
response=reader.readLine();
System.out.println(“1:+响应);
response=reader.readLine();
System.out.println(“1:+响应);
}
writer.write(“用户极客”+“\r\n”);
writer.flush();
response=reader.readLine();
系统输出打印项次(“2”+响应);
writer.write(“传递hello”+“\r\n”);
writer.flush();
response=reader.readLine();
系统输出打印项次(“3”+响应);
writer.write(“pasv”+“\r\n”);
writer.flush();
response=reader.readLine();
系统输出打印项次(“5”+响应);
字符串[]r=response.trim().split(“,”);
字符串reg=r[4];
字符串add=r[5]。替换(“)”,“”);
int m=Integer.parseInt(reg);
inta=Integer.parseInt(add);
int端口1=m*256+a;
套接字数据套接字=新套接字(“127.0.0.1”,端口1);
writer.write(“类型A\r\n”);
writer.flush();
response=reader.readLine();
系统输出打印项次(“6”+响应);
BufferedReader reader2=新的BufferedReader(新的InputStreamReader(datasocket.getInputStream());
writer.write(“列表\r\n”);
writer.flush();
response=reader.readLine();
系统输出打印项次(“7”+响应);
列表文件=新的ArrayList();
字符串文本;
而((text=reader2.readLine())!=null){
字符串文件名=解析文件名(文本);
添加(文件名);
}
reader2.close();
datasocket.close();
reader.readLine();
用于(字符串文件:文件){
int-passivePort=getPort(读写器);
writer.write(“RETR\r\n”);
writer.flush();
System.out.println(响应);
字节[]mybytearray=新字节[1024];
try(socketfilesocket=newsocket(“localhost”,被动端口);
InputStream is=filesocket.getInputStream();
FileOutputStream fos=新的FileOutputStream(“c:/Users/Username/Desktop/FTP/”+文件)){
整数计数;
而((count=is.read(mybytearray))>=0){
fos.write(mybytearray,0,计数);
}
}
}
writer.write(“RETR\r\n”);
writer.flush();
response=reader.readLine();
系统输出打印项次(“8”+响应);
Socket filsocket=新套接字(“本地主机”,端口1);
InputStream=null;
FileOutputStream=null;
字节[]mybytearray=新字节[1024];
试一试{
is=filsocket.getInputStream();
fos=新文件输出流(“myfile.txt”);
整数计数;
而((count=is.read(mybytearray))>=0){
fos.write(mybytearray,0,计数);
}
}最后{
fos.close();
is.close();
filsocket.close();
}
}
私有字符串解析文件名(字符串文本){
返回“abc.txt”;
}
private int getPort(BufferedReader,BufferedWriter-writer)抛出IOException{//这是第135行
字符串响应;
writer.write(“PASV”+“\r\n”);
writer.flush();
response=reader.readLine();
系统输出打印项次(“5”+响应);
字符串[]r=response.trim().split(“,”);
字符串reg=r[4];
字符串add=r[5]。替换(“)”,“”);
int m=Integer.parseInt(reg);
inta=Integer.parseInt(add);
返回m*256+a;
}
}       

提前感谢:)

命令有一个强制参数,指定要下载的文件名。服务器如何知道您要下载的文件

writer.write("RETR " + file + "\r\n");
见:

RETR

不管怎样,为什么要自己实现FTP协议?使用一些现有的impl