2017-09-04 299 views
1

我製作了一個FTPS客戶端陣列,並試圖將其連接到我感興趣的端口ip &。這是代碼。當連接到Java中的FTP端口990時出現「連接被拒絕」

public class ftptest 
{ 
    public static void delete_files(String path, int n) throws IOException 
    { 
     String realpath; 
     for(int i=0 ; i<n ; i++) 
     { 
      realpath = path+i; 
      File file = new File(realpath); 
      FileUtils.cleanDirectory(file); 
     } 
    } 

    public static void main(String[] args) throws Exception 
    { 
     int number = 1; 
     String ip = "some_ip"; 
     int port = 990; 

     FTPSClient[] client = new FTPSClient[number]; 

     System.out.println(ip); 
     System.out.println("port = "+ port); 


     for(int i = 0; i < number; i++) 
     { 
      String path = "D:\\ftptest\\client"+i;   
      File file = new File(path); 
      file.mkdir();  


      client[i] = new FTPSClient(true); 
      client[i].setRemoteVerificationEnabled(false); 
      client[i].setTrustManager 
      (TrustManagerUtils.getAcceptAllTrustManager());   

      client[i].enterLocalPassiveMode(); 


      client[i].setControlEncoding("UTF-8"); 
      client[i].connect(ip,port); 

      System.out.println("Connected to " + ip + "."); 
     } 
    } 
} 

但不知何故,在client[i].connect(ip, port)部分與錯誤

異常螺紋失敗 「主」 java.net.ConnectException:連接被拒絕:>連接 在java.net.DualStackPlainSocketImpl.connect0 (本機方法) 在java.net.DualStackPlainSocketImpl.socketConnect(來源不明) 在java.net.AbstractPlainSocketImpl.doConnect(來源不明) 在java.net.AbstractPlainSocketImpl.connectToAddress(來源不明) 在java.net.AbstractPlainS ocketImpl.connect(來源不明) 在java.net.PlainSocketImpl.connect(來源不明) 在java.net.SocksSocketImpl.connect(來源不明) 在java.net.Socket.connect(來源不明) 的組織。 apache.commons.net.SocketClient.connect(SocketClient.java:182) at org.apache.commons.net.SocketClient.connect(SocketClient.java:203) at org.apache.commons.net.SocketClient.connect( SocketClient.java:296) 在com.samsung.ftptest.ftptest.main(ftptest.java:66)

當它是FTP,FTPS不,這是工作的罰款。有人知道爲什麼它不起作用嗎?

謝謝。

+0

也許FTP服務器沒有設置爲FTPS? –

+0

@Scary Wombat感謝您的評論。那麼你會認爲代碼本身沒有問題?順便說一句,我改變了client [i] = new FTSClient(「true」)給client [i] = new FTSClient(true),刪除了引號。 – sanghyun

+0

對不起,我沒有爲你做這個假設 –

回答

1

上你運行該系統就可以了,不連接到服務器機器上的端口990。有許多的原因,這可能是這種情況,包括:

  • 服務器沒有偵聽端口990
  • 防火牆阻止端口990

你應該做的第一件事是找到使用FTPS成功連接到此服務器的客戶端,並檢查其配置:

  • 它配置了哪個端口?
  • 它使用方法是:。
    • 明確FTPS(這是優選的,符合標準的方式來做到FTPS它連接在平原FTP端口21,則協商到安全協議
    • 隱FTPS (這種方法從來不是一個標準,但確實發生在野外。如HTTPS,不同的端口(通常是990)時,以及SSL握手連接後立即發生)

一旦你知道這些事情,你可以把正確的端口和正確的方式進入你的代碼。

如果你是某港口,而且它從其他機器的工作原理,那麼防火牆是可能的罪魁禍首。證明你無法連接,使用telnet:

unixprompt$ telnet serverhostname 990 

如果它掛起,或說「連接被拒絕」,你知道這臺機器不能達到它。如果你得到「連接到...」,你知道至少你有TCP連接(然後ctrl-] quit出去)。

如果你發現它的防火牆,爲戰鬥準備。你正在爲控制連接而苦苦掙扎 - 數據連接是一場全新的戰鬥。爲被動模式顯式FTPS打開防火牆非常簡單,並在此IETF草案中有記錄:https://tools.ietf.org/html/draft-fordh-ftp-ssl-firewall-00 - 但防火牆管理員非常不願意這麼做。

+0

非常感謝的種類和具體的答案。事實證明,感興趣的服務器不支持端口990更改爲21端口轉移問題的另一個 - javax.net.ssl.SSLHandshakeException:java.security.cert.CertificateException :.這問題後的問題,但您的解決方案是正確的!非常感謝,祝你有美好的一天! – sanghyun

1

服務器可能不支持(不建議使用的)隱式FTPS模式。

你最好使用反正明確的模式:

client[i] = new FTPSClient(); 
// ... 
client[i].connect(ip, 21); 

(假設服務器不支持FTP通過TLS/SSL在所有)

+1

我們無法猜測服務器是否符合標準顯式模式,或不推薦使用隱式模式。 OP應該與已知的工作客戶端進行測試。 – slim

+0

感謝您的評論。在我的情況下,既不工作了:( – sanghyun

+0

從其他問題的評論,似乎我的解決方案做的工作,這也帶來了另外一個問題是一個不同的主題。 –

相關問題