在Java中调用`GET`时获取`500 Unknown Command`

时间:2014-02-28 08:13:18

标签: java sockets ftp

好吧,所以我给了一个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>

之前有没有人遇到类似的问题?如果是这样,你是如何解决它的?

1 个答案:

答案 0 :(得分:1)

我做了一个与你在这里做的非常相似的副项目,我遇到了你在这里讨论过的同样的问题。我仍然没有弄清楚为什么我无法模拟调用GET并读取数据流,但这是我的解决方案。

首先,您需要使用RETR代替GET。如果您不熟悉RETR的作用,它基本上允许您通过您为数据传输生成的临时port将文件作为字节数据包发送。

要实例化临时port,您需要成为Passive Mode.所以,输入:

  

引用pasv

您的输出将如下所示:

  

227进入被动模式(127,0,0,1,143,155)。

快速浏览两个括号之间的数字可能对你没有任何意义,但是,可以从那里得出两个细节。

前3个数字代表localhost,始终为127.0.0.1,其他两个数字代表p1p2。在这种情况下,我们有p1 = 143p2 = 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这个词。

我想我今晚打得很好。我现在要去睡觉了。如果您在下面的评论中需要进一步的帮助,请告诉我,我会尽快回复。另外,如果我说的话对你没有意义,请告诉我。