Java 从头开始构建FTP客户端:错误“;425罐';t打开数据连接以进行传输“;

Java 从头开始构建FTP客户端:错误“;425罐';t打开数据连接以进行传输“;,java,ftp,connection,port,Java,Ftp,Connection,Port,我正在尝试用Java从头开始创建一个FTP客户端 我使用Filezilla作为服务器,可以连接到某个点。我的意思是,我有命令端口工作,但无论我搜索多少,我都无法连接数据端口 我找过的所有网站都说问题与防火墙和/或路由器有关,但是,当我尝试使用Filezilla客户端连接到服务器时,一切都很顺利 到目前为止,我所拥有的: serverSocket = new ServerSocket(20); socket = new Socket(127.0.0.1, 21); read

我正在尝试用Java从头开始创建一个FTP客户端

我使用Filezilla作为服务器,可以连接到某个点。我的意思是,我有命令端口工作,但无论我搜索多少,我都无法连接数据端口

我找过的所有网站都说问题与防火墙和/或路由器有关,但是,当我尝试使用Filezilla客户端连接到服务器时,一切都很顺利

到目前为止,我所拥有的:

    serverSocket = new ServerSocket(20);
    socket = new Socket(127.0.0.1, 21);
    reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

    writer.write("USER " + Anonymous + "\n");
    writer.flush();
    writer.write("PASS " + "" + "\n");
    writer.flush();
    writer.write("PORT 127,0,0,1,0,14");
    writer.flush();
    writer.write("EPRT |1|127.0.0.1|20|");
    writer.flush()
    dataSocket = serverSocket.accept();

将我登录到服务器并断开连接。为了解决这个问题,我在一个线程内(暂时)添加了一个infinte while循环,直到我可以连接到数据端口。

当您在(大概)数据套接字上执行accept
socket2
时,您不会告诉服务器在哪里可以找到这个套接字,例如,您以前没有发出
port
EPRT
命令。在尝试实施协议之前,请深入阅读协议文档(主要是RFC959)

serverSocket = new ServerSocket(50222);
这将在端口50222上创建侦听套接字

writer.write("PORT 127,0,0,1,0,14");
这会告诉服务器在端口14上连接到您


想想看。

我想出来了。问题是服务器试图连接到一个端口,但该端口不正确。我决定将服务器置于被动模式,并连接到我看到的套接字。当它响应此“227进入被动模式(127,0,0,1194,16)”时,最后两个数字是端口号。您必须将这些小数转换为十六进制,然后将这两个十六进制数合并得到整个端口号。在这种情况下,特别是十进制中的194等于十六进制中的“C2”,十进制中的16等于“10”在十六进制中,这两个十六进制数加在一起就得到了“C210”,当你把它们返回到十进制时,你得到了“49680”,这就是你必须连接的端口号

  clientSocket = new Socket(127.0.0.1, 21);
  reader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
  writer = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()));

  writer.write("USER " + Anonymous + "\n");
  writer.flush();
  writer.write("PASS " + "" + "\n");
  writer.flush();
  writer.write("PASV");
  writer.flush()
  String testPort = scanner.nextLine(); //type in the number you get when you do math
                                        //in this case 49680
  socketServer = new Socket(host, Integer.parseInt(testPort));

它应该连接数据端口。显然,这不是最终的计划,但它是一个概念证明。感谢您的帮助。

在您真正传输文件之前,不涉及任何数据端口。听起来您需要(重新)读取RFC。@immibis Ok,所以我添加了一个命令来存储test.txt文件。那之后我该怎么办?它不断地给我错误(我试图使用一个服务器套接字来等待来自服务器的连接,但我在到达之前就得到了错误),如果你更改代码,你需要在这里保持它最新,否则没有人知道你在说什么。不要只说“错误”。张贴它。粘贴它。进入你的问题。@EJP好的,我更新了它。很抱歉造成混淆,我创建了一个帐户只是为了问这个问题。我不断收到的错误是,当我尝试执行涉及数据端口的任何操作时,服务器会发送一条消息“425无法打开数据连接以进行传输”。服务器日志显示,这两个新命令都成功执行,但客户端仍然在“dataSocket.accpet()处等待连接“.我是否可以将命令按不同的顺序排列?我应该在RFC959中查找什么?我尝试查找标题中描述的错误425,但这不是非常有用的信息。请阅读文档,不要只发出您在某处看到的两个命令。您告诉服务器的端口必须反映实际情况。”l您使用的端口(在本例中为50222)不仅仅是您刚编的端口。实际上,最后两个数字应该是十六进制的。我之所以使用14,是因为十六进制中的14是十进制中的20。您是对的,我没有正确的端口,它应该是‘serverSocket=new serverSocket(20)但即使这样,它仍然无法连接。我正在阅读RFC959,希望我能以这种方式想出解决方案