好吧,所以我给了一个Java
FtpClient类,我应该完成/修改,以便最终的产品可以作为WebServer。
以下是一种允许我通过命令行与服务器进行交互的方法。
/* * Send ftp command * @param command: the full command line to send to the ftp server * @param expected_code: the expected response code from the ftp server * @return the response line from the ftp server after sending the command */ private String sendCommand(String command, int expected_response_code){ String response = ""; try { // send command to the ftp server controlWriter.writeBytes(command); // get response from ftp server response = controlReader.readLine(); if (DEBUG) { System.out.println("Current FTP response: " + response); } // check validity of response if (!response.startsWith(String.valueOf(expected_response_code))) { throw new IOException( "Bad response: " + response); } } catch (IOException ex) { System.out.println("IOException: " + ex); } return response; }
然而,当我调用GET
命令时,即
sendCommand("get " + __file__name__ + "\r\l", 200);
),
我收到以下回复:
500 Unknown命令。
我几乎100%确定此问题与我上面发布的方法无关,但我只发布了它,因此您将通过sendCommand
方法知道我所指的是什么。 / p>
之前有没有人遇到类似的问题?如果是这样,你是如何解决它的?
答案 0 :(得分:1)
我做了一个与你在这里做的非常相似的副项目,我遇到了你在这里讨论过的同样的问题。我仍然没有弄清楚为什么我无法模拟调用GET
并读取数据流,但这是我的解决方案。
首先,您需要使用RETR
代替GET
。如果您不熟悉RETR
的作用,它基本上允许您通过您为数据传输生成的临时port
将文件作为字节数据包发送。
要实例化临时port
,您需要成为Passive Mode.
所以,输入:
引用pasv
您的输出将如下所示:
227进入被动模式(127,0,0,1,143,155)。
快速浏览两个括号之间的数字可能对你没有任何意义,但是,可以从那里得出两个细节。
前3个数字代表localhost
,始终为127.0.0.1
,其他两个数字代表p1
和p2
。在这种情况下,我们有p1 = 143
和p2 = 155
。这两个数字可用于确定哪些port
已分配给我们进行数据传输。
启动command line
界面
要查找端口号,请插入以下公式中的数字:
PORT = p1 * 256 + p2
因此,在这种情况下,我们的端口号为(143 * 256) + 155
==> (36763).
既然我们已向我们开放转让port
并准备好进行数据传输,您可以继续使用上述公式派生的Socket
来实例化新的port number
(请注意,每次运行quote pasv
时,数字都会有所不同,所以不要认为它们是常量。)
此处的下一步是将文件从您自己发送到客户端。请注意,您不是将数据包定向到特定客户端,而是当前连接的任何客户端都将接收数据包。
要发送文件,请输入以下命令:
引用retr
现在您可以使用DataInputStream
中的Socket
类来读取所有字节,显示它们,然后将它们写入原始文件的相同副本,或者执行您计划执行的任何操作和他们一起。
Note.. Note... Note... : the commands listed above were meant to be entered from the command line
但是既然你希望你的应用程序处理所有的工作(我假设),那么可以通过一些调整来从Java应用程序传递相同的命令。您基本上只需要从我们使用过的所有命令中取出quote
这个词。
我想我今晚打得很好。我现在要去睡觉了。如果您在下面的评论中需要进一步的帮助,请告诉我,我会尽快回复。另外,如果我说的话对你没有意义,请告诉我。