我正在尝试用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循环(暂时),直到我可以连接到数据端口。
答案 0 :(得分:1)
当您在(可能)数据套接字socket2
上接受时,您不会告诉服务器可以找到此套接字的位置,例如您之前没有发出PORT
或EPRT
命令。在尝试实现协议之前,请仔细查看协议文档(主要是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));
那应该连接数据端口。显然这不是最终的计划,而是它的概念证明。感谢帮助过的人们。