GVKun编程网logo

Apache Commons NET:我应该在每个连接上创建一个新的FTPClient对象还是重用一个?

11

如果您对ApacheCommonsNET:我应该在每个连接上创建一个新的FTPClient对象还是重用一个?感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解ApacheCommonsNET:我应

如果您对Apache Commons NET:我应该在每个连接上创建一个新的FTPClient对象还是重用一个?感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解Apache Commons NET:我应该在每个连接上创建一个新的FTPClient对象还是重用一个?的各种细节,此外还有关于ajax – 重用XMLHttpRequest对象还是创建一个新对象?、Ajax密集页面:每次重用同一个XMLHttpRequest对象还是创建一个新对象?、apache common-httpclient的连接关闭问题、Apache Commons FTPClient.listFiles的实用技巧。

本文目录一览:

Apache Commons NET:我应该在每个连接上创建一个新的FTPClient对象还是重用一个?

Apache Commons NET:我应该在每个连接上创建一个新的FTPClient对象还是重用一个?

我只是想知道:在Java应用程序中,每次需要连接到FTP服务器时,我应该创建一个新的FTPClient对象,还是应该创建一个FTPClient()对象,并在每次连接至一个FTP服务器?

答案1

小编典典

重用会更好,因为每次创建新连接甚至与新服务器时都不需要新实例。因为连接和断开连接方法可以为您完成这项工作。

因此,请尽可能多地重用对象。

ajax – 重用XMLHttpRequest对象还是创建一个新对象?

ajax – 重用XMLHttpRequest对象还是创建一个新对象?

我搜索stackoverflow但有矛盾的答案:

Why should I reuse XmlHttpRequest objects?

Ajax-intensive page: reuse the same XMLHttpRequest object or create new one every time?

另外,有一个关于w3schools.com的建议:

If you have more than one AJAX task on your website,you should create
ONE standard function for creating the XMLHttpRequest object,and call
this for each AJAX task.

为什么这个建议?而是在我的页面上使用一个全局的XMLHttpRequest对象来处理所有的Ajax任务。

你误解了W3School的建议。我将突出相关部分:

If you have more than one AJAX task on your website,you should create ONE standard function for creating the XMLHttpRequest object,and call this for each AJAX task.

它表示您使用一个AJAX函数来获取请求。此功能将处理IE和其他浏览器之间的不一致。符合标准的浏览器中的XMLHttpRequest,以及IE中的ActiveXObject。

我建议使用多个XHR对象。使用一个全局xhr对象,您的应用程序只能在给定时间处理一个请求。这也很容易出错(例如XMLHttpRequest launches multiple times without initiating the onreadystatechange function)。

W3schools的意思是:

function createXHR() {
    try {
        return new XMLHttpRequest();
    } catch (e) {
        try {
            return new ActiveXObject("Microsoft.XMLHTTP");
        } catch (e) {
            return new ActiveXObject("Msxml2.XMLHTTP");
        }
    }
}
var xhr = createXHR();
xhr.open('get','/test',true);
xhr.send();

虽然最好创建一个处理请求的函数,如jQuery.ajax

Ajax密集页面:每次重用同一个XMLHttpRequest对象还是创建一个新对象?

Ajax密集页面:每次重用同一个XMLHttpRequest对象还是创建一个新对象?

我正在开发某种在线多用户编辑器/合作社界面,它将在一页生命周期内处理大量(例如成千上万个)ajax请求。

最佳方法:(在稳定性,兼容性,避免麻烦方面为“最佳”)

  1. 创建一个XMLHttpRequest对象,并将其重新用于每个HTTP请求

  2. 为每个HTTP请求创建一个新的XMLHttpRequest对象

  3. 管理XMLHttpRequest对象的动态“池”,在启动HTTP请求且现有对象不可用时创建一个新对象,并在其上一个请求成功完成后将先前创建的对象标记为“可用”

我认为1不是一个选择,因为某些请求可能会失败,而上一个请求尚未完成时,我可能正在发起新请求,等等。

至于2,我猜这是内存泄漏,或者可能导致疯狂的内存/资源使用。还是可以在请求完成后以某种方式关闭或删除对象?(在哪里/如何?)还是JS垃圾收集器适当地照顾好了它本身?

以前从未尝试过3,但感觉就像两全其美。还是这样的方法是不必要的,还是我仍然缺少潜在的问题?确切地说,什么时候可以假定请求完成(因此,该对象可用于新请求),是何时接收readyState
4和http status 200?(即,我可以确定之后不会再有更新或回调了吗?)

答案1

小编典典

需要时创建一个新的。一旦不再需要旧GC,GC将对其进行处理。

但是,对于像合作编辑器这样的工具,您可能需要考虑使用WebSockets而不是一直发送请求。一个小的HTTP请求的开销是巨大的,而WebSocket连接几乎没有开销。

apache common-httpclient的连接关闭问题

apache common-httpclient的连接关闭问题

apache common-httpclient的连接关闭问题

| date : 2017.3.7 |

apache 提供的common-httpclient (3.1 的版本),在调用httpclient的时候,是很方便的,在实际的项目中,调用第三方服务,也经常使用;这次在客户现场发现了一个问题;

我们调用第三方的服务,第三方服务在监控连接的时候,提到我们发起的连接有许多的close_wait连接;

检查

原来是怀疑连接没有释放;检查了代码,是有调用了 releaseConnection的方法;没细看,看这个方法名,就是关闭连接了;有点怪异;

继续查下去;做了一个测试;目前使用httpclient的方法大致如下:

    private void doHttpTest(){
        HttpClient httpClient = new HttpClient();
        GetMethod get = new GetMethod("http://www.baidu.com");
        try{
            httpClient.executeMethod(get);
        } catch (Exception err){

        } finally {
            get.releaseConnection();
        }
    }

    @Test
    public void do100Test(){
        for(int i=0 ;i<100;i++){
            this.doHttpTest();
        }
        System.out.print("111");
    }

该方法在自测时候,在最后一个 System.out.print 方法打了断点;(知道为啥要留这个方法了吧,打断点用的。。哈哈哈) debug , 之后,检查了该进程发起的连接; 先看看 www.baidu.com的IP 吧;

百度的IP

JPS看看,咱的进程ID

来吧,检查一下进程 windons 下面的命令:netstat -ano|find "20168" |find "61." 计数命令:netstat -ano|find "20168" |find "61." /c

输入图片说明

输入图片说明

100个连接哦,,还都是 CLOSE_WAIT的; 好吧;就说明我们上面脚本中循环了100个,就压根没有是否端口呀。。。

抽丝剥茧啊

为啥,,这个是为啥。已经调用了 releaseConnection() ;难道是releaseConnection()的问题,要不看看的呗。 GetMethod --> HttpMethodBase --> HttpConnection --> HttpConnectionManager 好吧,这里是个接口。咋整,从 HttpClient入口,发现默认是使用 SimpleHttpConnectionManager ,走起; 源码如下: Alt text 看到了,坑的地方来了; if(this.alwaysClose) 这个值,默认是false的哦。。而且,貌似还没地方赋值的呢。。换句话说,默认是 finishLastResponse,查看这个方法,卧槽,厉害了,只是清理了 inputStream 呢。但连接木有关闭啊; 要关闭连接怎么办?我们自己来关闭?往下翻了翻,额,有个closeIdleConnections 的方法;这个的源码看了一下,额,关闭在Nms之前的连接呢。。恩。这个可以用; 试试看;

新的测试代码

新的测试代码如下:就补充了closeIdleConnections的内容;

   private void doHttpTest(){
        HttpClient httpClient = new HttpClient();
        GetMethod get = new GetMethod("http://www.baidu.com");
        try{
            httpClient.executeMethod(get);
        } catch (Exception err){
        } finally {
            get.releaseConnection();
            //就加了这里哈。。
            httpClient.getHttpConnectionManager().closeIdleConnections(0L);
        }
    }

    @Test
    public void do100Test(){
        for(int i=0 ;i<100;i++){
            this.doHttpTest();
        }
        System.out.print("111");
    }

同以上的测试过程,检查连接数: 输入图片说明

搞定,木有对 www.baidu.com 的连接了;;很好,连接都关闭了。

结尾

连接的关闭,要补上 closeIdleConnections 的调用;或者是直接对 connection.close 的方法。 那么为什么 apache 的 common-httpclient不直接关闭呢。实际上,这个是基于效率的考虑,在网络连接的时候, http连接的创建是耗时的,而框架是希望同一个connection可以复用的。但我们在使用的时候,每次都 new HttpClient 的方式,也就导致了复用不了;在这个情况下,还是干脆关闭吧;

如果并发过高,不进行关闭的话,应用会linux下运行会出现 too many open files 的错误。。

另外:考虑升级了,升级到 httpcomponents 的 httpclient

<dependency>
  <groupId>org.apache.httpcomponents</groupId>
  <artifactId>httpclient</artifactId>
  <version>4.5.3</version>
</dependency>

参考资料

httpclient源码分析-如何重用连接

Apache Commons FTPClient.listFiles

Apache Commons FTPClient.listFiles

org.apache.commons.net.ftp.FTPClient在一个应用程序中使用FTP服务器。我能够connect,login,pwd和cwd。但是,当我尝试list文件时,它不会返回该目录中的文件列表,我肯定知道该目录中有文件。我正在使用方法FTPFile[] listFiles(),它返回的空数组FTPFile。

请在我正在尝试的代码段下面找到:

        String hostname = properties.getProperty("FTP_SERVER");        String user = properties.getProperty("FTP_USER");        String passwd = properties.getProperty("FTP_PASSWD");        FTPClient client = new FTPClient();        client.connect(hostname);        client.login(user, passwd);        String reply = client.getStatus();        System.out.println(reply);        client.enterRemotePassiveMode();        client.changeWorkingDirectory("/uploads");        FTPFile[] files = client.listFiles();        System.out.println(files.length);        for (FTPFile file : files) {            System.out.println(file.getName());        }        String[] fileNames = client.listNames();        if (fileNames != null) {            for (String file : fileNames) {                System.out.println(file);            }        }        client.disconnect();

答案1

小编典典

问题是您想在连接之后但在登录之前进入被动模式。您的代码对我没有任何回报,但这对我有用:

import org.apache.commons.net.ftp.FTPClient;import java.io.IOException;import org.apache.commons.net.ftp.FTPFile;public class BasicFTP {    public static void main(String[] args) throws IOException {        FTPClient client = new FTPClient();        client.connect("c64.rulez.org");        client.enterLocalPassiveMode();        client.login("anonymous", "");        FTPFile[] files = client.listFiles("/pub");        for (FTPFile file : files) {            System.out.println(file.getName());        }    }}

给我这个输出:

c128c64c64.huincomingplus4

关于Apache Commons NET:我应该在每个连接上创建一个新的FTPClient对象还是重用一个?的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于ajax – 重用XMLHttpRequest对象还是创建一个新对象?、Ajax密集页面:每次重用同一个XMLHttpRequest对象还是创建一个新对象?、apache common-httpclient的连接关闭问题、Apache Commons FTPClient.listFiles的相关知识,请在本站寻找。

本文标签: