2016-07-15 224 views
2

你好我已經連接到FTP使用URLConnection只有IP地址,沒有指定登錄憑證。FTP連接沒有用戶名和密碼?

URLConnection conn = new URLConnection(new URL("ftp://222.101.102.1/etc")); 

它的工作原理,沒有證書,因爲服務器可能允許匿名連接。

但實踐我想讓從頭與Socket客戶端的FTP連接,我創建了一個新的套接字連接到IP:

Socket socket = new Socket("222.101.102.1", 21); 
if (socket != null) { 
    BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
    String version = reader.readLine(); 
    System.out.println(version); 
} 

這將打印220 vsFTPd (2.0.5)

但是當我嘗試做命令狀LS \r\n

我得到530 Please login with USER and PASS

爲什麼它要求我登錄,如果沒有URLConnection

此代碼沒有編譯,因爲它是從我的另一臺計算機記憶下來的,所以讓我知道如果您發現錯誤,我馬上編輯。

+0

IIRC,當你建立一個套接字時,你正在圍繞一個協議建立整個工作,但你必須設置它將如何通過該協議進行通信。當您構建URLConnection對象時,您正在創建一個已經包含這些工作的對象。換句話說,URLConnection知道如何連接和登錄,但在你正在構建的Socket中,它只知道如何物理連接。它不知道下一步該怎麼做。 –

+0

@blahfunk這就是我所需要的!我需要有關URLConnection如何執行此操作的信息,它作爲默認連接憑據使用的位置,我在哪裏獲得該信息?人們說用戶名是匿名的,或者ftp和密碼是電子郵件,但我們並不使用那些我不知道的電子郵件。 – Jony

回答

3

我設法弄明白了。

URL.openConnection()基本上根據協議返回實現URLStreamHandler的類。所以在這種情況下,協議是ftp,它返回FtpURLConnection

因此,有一個檢查,如果用戶名爲空(不是在URL中指定),如果是這樣它,它與@

[email protected]未設置爲匿名,並使用Java版本的密碼確定是爲了什麼目的,也許是爲了登錄歷史。 但你可以使用任何密碼登錄匿名,除非它被配置爲我認爲的其他東西。

 if(this.user == null) { 
      this.user = "anonymous"; 
      String var11 = (String)AccessController.doPrivileged(new GetPropertyAction("java.version")); 
      this.password = (String)AccessController.doPrivileged(new GetPropertyAction("ftp.protocol.user", "Java" + var11 + "@")); 
     } 

所以我基本上是在登錄時Anonymous沒有密碼