Tag: apache commons net

用Java确定另一个国家的互联网时间

我正在开发一个将被世界各地的人们使用的Java应用程序。 一项function要求它显示澳大利亚墨尔本当前时间。 我找到了这个答案,并按如下方式调整了代码,但它返回了我当前的时间(如预期的那样)。 它使用Apache Commons Net库 : try { String TIME_SERVER = “time-a.nist.gov”; NTPUDPClient timeClient = new NTPUDPClient(); InetAddress inetAddress = InetAddress.getByName(TIME_SERVER); TimeInfo timeInfo = timeClient.getTime(inetAddress); long returnTime = timeInfo.getMessage().getTransmitTimeStamp().getTime(); return new Date(returnTime); } catch (Exception e) { System.out.println(e.getMessage()); return null; } 如何修改此代码以返回墨尔本的时间,而不是我的时间? 我也愿意接受其他解决方案来解决这个问题。 谢谢! 编辑: 根据Jon的建议,我使用了JodaTime库并构建了以下代码来解决问题。 通过将Australia / Melbourne更改为此处找到的任何时区,它可以用于其他时区。 try { //Get the time […]

JDK 8u161中Apache FTPS客户端中的SSL会话重用

使用Apache Commons-Net的FTPSClient连接到现代FTP / S服务器不起作用。 原因是它们需要重用SSL会话,即需要重新使用来自控制连接的SSL会话进行数据连接。 这通常可以在服务器中停用,但也就是说 不安全 并不总是一个选项(因为服务器可能不在您的控制之下) 正确的解决方案是让客户端实际重用会话。 Commons-Net存在一个漏洞 ,但看起来不会很快得到解决。 此外,还有一个由Cyber​​duck(一个FTP客户端应用程序)的作者创建的“reflection黑客”,它在他们的bugtracker中进行了描述,并且在博客文章中更深入地描述。 StackOverflow上还有一篇相关文章描述了这个解决方案。 他们使用reflection来访问JDK的SSLSessionContext的内部缓存并注入一个新条目。 这个hack工作正常,直到JDK 8u161和9.0.4(?),其中引入了对更改日志中描述的SSL的一些更改。 显然,一些实现细节已经改变,导致黑客不再工作。 据我所知,现在有以下选项: 继续使用JDK 8u152,直到有人找到解决方案/ apache-commons-net得到修补/ JDK更改被回滚(不是真正的选项,因为这会切断生产系统的安全更新) 使用不同的FTPS客户端(我能找到的唯一替代方案是专有且非常昂贵) 尝试对SSLSessionContext实现的更改进行反向工程以查找新的解决方法。 这看起来不仅仅是一项非常重要的任务 – 解决方案可能会再次成为黑客,因此可能随时再次破裂。 不要再使用FTP / S. 谁能建议如何在这里继续? 相关链接: http://mail.openjdk.java.net/pipermail/security-dev/2016-December/015254.html https://bugs.openjdk.java.net/browse/JDK-8170813 https://issues.apache.org/jira/browse/NET-426

如何使用apache.commons.net.ftps配置客户端身份validation?

我使用apache.commons.net -framework在java中实现了FTPS客户端(FTP over SSL / TLS)。 它被配置为在默认端口21上执行显式安全性。 ftpsClient = new FTPSClient(false); ftpsClient.setTrustManager(getConfiguration().getCertificatesManager()); ftpsClient.connect(getConfiguration().getHostName(), getConfiguration().getPort()); 只要我不在服务器上强制执行客户端身份validation,一切正常。 但我需要启用客户端身份validation,因此我在服务器上强制执行它并配置客户端系统属性: -Djavax.net.ssl.keyStore=”D:/…/ftps-client-auth.keystore” -Djavax.net.ssl.keyStorePassword=”*****” -Djavax.net.ssl.keyStoreType=JKS 我得到的就像没有设置系统属性一样: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174) at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:136) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1806) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:986) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1170) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1197) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1181) at org.apache.commons.net.ftp.FTPSClient.sslNegotiation(FTPSClient.java:265) at org.apache.commons.net.ftp.FTPSClient._connectAction_(FTPSClient.java:207) at org.apache.commons.net.SocketClient.connect(SocketClient.java:172) at org.apache.commons.net.SocketClient.connect(SocketClient.java:192) 服务器日志说: DEBUG: Client “”, “SSL_accept failed: error:140890C7:SSL routines:SSL3_GET_CLIENT_CERTIFICATE:peer […]

FTPClient下载文件失败,retrieveFile()方法replyCode = 550

/ *我在localhost上运行一个FTP服务器。当我下载文件时使用ftpClient.retrieveFile()方法,它的replyCode是550。 我读了commons-net的API并找到550 replyCode,定义是“public static final int FILE_UNAVAILABLE 550”。但我无法从我的代码中找到问题。 谢谢你的帮助。 * / FTPClient ftpClient = new FTPClient(); FileOutputStream fos = null; try { ftpClient.connect(“192.168.1.102”,2121); ftpClient.login(“myusername”, “12345678”); ftpClient.setControlEncoding(“UTF-8”); ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); String remoteFileName = “ftpserver.zip”;//this file in the rootdir fos = new FileOutputStream(“f:/down.zip”); ftpClient.setBufferSize(1024); ftpClient.enterLocalPassiveMode(); ftpClient.enterLocalActiveMode(); ftpClient.retrieveFile(remoteFileName, fos); System.out.println(“retrieveFile?”+ftpClient.getReplyCode()); fos.close(); ftpClient.logout(); } catch (IOException e) { e.printStackTrace(); } […]

如何使用Java从FTP下载文件?

使用此代码,我总是得到一个空文件。 我和它有什么关系? login始终是true 。 (ofc,这里不是真正的密码) import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPFile; import java.io.*; public class Logs { public static void main(String[] args) { FTPClient client = new FTPClient(); try { client.connect(“myac.cs-server.pro”, 121); boolean login = client.login(“a3ro”, “passWordIsSecret”); System.out.println(login); String remoteFile1 = “myac_20150304.log”; File downloadFile1 = new File(“C:\\Users\\Aero\\Desktop\\test\\myac.log”); OutputStream outputStream1 = new BufferedOutputStream(new FileOutputStream(downloadFile1)); boolean success = client.retrieveFile(remoteFile1, […]

commons-net ftp正在上传损坏的文件

我正在尝试使用apache commons-net进行ftp文件传输。 问题是文件间歇性地到达服务器损坏。 ‘腐败’我的意思是winrar告诉我一个zip文件有一个’意外的归档结束’。 有时文件是完全空的。 我注意到这种情况发生在更大的文件(100kb +)上,但是对于小文件也是如此(20kb)。 我知道上传的源zip文件是有效的,只有243kb。 我没有从代码中得到任何错误/exception。 这是正在执行的代码: try { int CON_TIMEOUT = (int) TimeUnit.SECONDS.toMillis(20); // fail if can’t connect within 20 seconds int LIVE_TIMEOUT = (int) TimeUnit.MINUTES.toMillis(5); // allow up to 5 minutes for data transfers FTPClient client = new FTPClient(); client.setConnectTimeout(CON_TIMEOUT); client.setDataTimeout(LIVE_TIMEOUT); client.connect(host); client.setSoTimeout(LIVE_TIMEOUT); client.login(user, pass); client.changeWorkingDirectory(dir); log(“client ready”); File file […]

将文件FTP到服务器,但结果以零字节大小到达

我想使用FTPClient将文件上传到数据库服务器。 它显示文件已成功传输,但文件为空(大小为0字节)。 下面是我用来构建的源代码。 谁能解决这个问题? package Examples; import org.apache.commons.net.ftp.*; import java.io.FileInputStream; import java.io.IOException; public class Main { public static void main(String[] args) { FTPClient client = new FTPClient(); FileInputStream fis = null; try { client.connect(“server”); client.login(“userid”, “password”); System.out.print(“Message : ” + client.getReplyString()); client.changeWorkingDirectory(“/loaddata”); System.out.println(“Working Directory” + client.printWorkingDirectory()); client.setDefaultPort(22); int f1 = client.getDefaultPort(); boolean f2 = client.setFileType(FTPClient.BINARY_FILE_TYPE); […]

一旦FTP在java中完成,就会创建0 kb文件

我正在尝试将文件FTP到远程计算机上。 以下是我的代码: – FTPClient ftpClient = new FTPClient(); ftpClient.connect(“home.abc.com”); ftpClient.login(“remote”, “guesst12”); int replyCode = ftpClient.getReplyCode(); ftpClient.changeWorkingDirectory(“share”)) ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); InputStream input = new FileInputStream(new File(“H:/testFile.txt”)); OutputStream out = ftpClient.storeFileStream(“testFile.txt”); Util.copyStream(input, out); out.close(); input.close(); ftpClient.completePendingCommand() ftpClient.logout(); ftpClient.disconnect(); 当我执行这段代码时,代码执行没有任何问题,但在远程机器上,当我检查文件时,正在创建文件,但没有内容(OKB)文件。 我在代码中遗漏了什么。 [更新]:我尝试使用以下代码存储文件: – if(ftpClient.storeFile(“testCopy.txt”, input)) { System.out.println(“File Stored Successfully”); } System.out.println(ftpClient.getReplyString()); 现在收到的回复代码是: – 451 Failure writing to local file. 这意味着什么。 […]

用Java下载整个FTP目录(Apache Net Commons)

我试图递归遍历登录到FTP服务器后到达的整个根目录。 我能够连接,所有我真正想做的就是通过整个结构进行递归并下载每个文件和文件夹,并使其与FTP上的结构相同。 到目前为止我所拥有的是一个有效的下载方法,它进入服务器并获取我的整个文件结构,这很棒,除非它在第一次尝试时失败,然后第二次工作。 我得到的错误如下: java.io.FileNotFoundException:output-directory \ test \ testFile.png(系统找不到指定的路径) 我设法上传了我在本地的目录的上传function,但是经过多次尝试我无法完全下载工作,我真的需要一些帮助。 public static void download(String filename, String base) { File basedir = new File(base); basedir.mkdirs(); try { FTPFile[] ftpFiles = ftpClient.listFiles(); for (FTPFile file : ftpFiles) { if (!file.getName().equals(“.”) && !file.getName().equals(“..”)) { // If Dealing with a directory, change to it and call the function again […]

如何保留使用Apache FTPClient检索文件时修改的日期?

我正在使用org.apache.commons.net.ftp.FTPClient从ftp服务器检索文件。 在文件保存在我的机器上时,保留文件的最后修改时间戳至关重要。 有没有人建议如何解决这个问题?