从头开始构建FTP客户端:错误" 425无法打开数据连接以进行传输"

时间:2014-05-09 02:57:50

标签: java ftp connection port

我正在尝试用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循环(暂时),直到我可以连接到数据端口。

3 个答案:

答案 0 :(得分:1)

当您在(可能)数据套接字socket2上接受时,您不会告诉服务器可以找到此套接字的位置,例如您之前没有发出PORTEPRT命令。在尝试实现协议之前,请仔细查看协议文档(主要是RFC959)。

答案 1 :(得分:0)

serverSocket = new ServerSocket(50222);

这将在端口50222上创建一个侦听套接字。

writer.write("PORT 127,0,0,1,0,14");

这告诉服务器在端口14上连接到你。

想一想。

答案 2 :(得分:0)

我明白了。问题是服务器试图连接到一个端口,它不是正确的。我决定做的是将服务器置于被动模式并连接到我看到的套接字。当它响应这个" 227进入被动模式(127,0,0,1,194,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));

那应该连接数据端口。显然这不是最终的计划,而是它的概念证明。感谢帮助过的人们。

相关问题