如果您对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对象还是重用一个?
- ajax – 重用XMLHttpRequest对象还是创建一个新对象?
- Ajax密集页面:每次重用同一个XMLHttpRequest对象还是创建一个新对象?
- apache common-httpclient的连接关闭问题
- Apache Commons FTPClient.listFiles
Apache Commons NET:我应该在每个连接上创建一个新的FTPClient对象还是重用一个?
我只是想知道:在Java应用程序中,每次需要连接到FTP服务器时,我应该创建一个新的FTPClient对象,还是应该创建一个FTPClient()对象,并在每次连接至一个FTP服务器?
答案1
小编典典重用会更好,因为每次创建新连接甚至与新服务器时都不需要新实例。因为连接和断开连接方法可以为您完成这项工作。
因此,请尽可能多地重用对象。
ajax – 重用XMLHttpRequest对象还是创建一个新对象?
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任务。
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对象,并将其重新用于每个HTTP请求
为每个HTTP请求创建一个新的XMLHttpRequest对象
管理XMLHttpRequest对象的动态“池”,在启动HTTP请求且现有对象不可用时创建一个新对象,并在其上一个请求成功完成后将先前创建的对象标记为“可用”
我认为1不是一个选择,因为某些请求可能会失败,而上一个请求尚未完成时,我可能正在发起新请求,等等。
至于2,我猜这是内存泄漏,或者可能导致疯狂的内存/资源使用。还是可以在请求完成后以某种方式关闭或删除对象?(在哪里/如何?)还是JS垃圾收集器适当地照顾好了它本身?
以前从未尝试过3,但感觉就像两全其美。还是这样的方法是不必要的,还是我仍然缺少潜在的问题?确切地说,什么时候可以假定请求完成(因此,该对象可用于新请求),是何时接收readyState
4和http status 200?(即,我可以确定之后不会再有更新或回调了吗?)
答案1
小编典典需要时创建一个新的。一旦不再需要旧GC,GC将对其进行处理。
但是,对于像合作编辑器这样的工具,您可能需要考虑使用WebSockets而不是一直发送请求。一个小的HTTP请求的开销是巨大的,而WebSocket连接几乎没有开销。
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 吧;
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 ,走起; 源码如下:
看到了,坑的地方来了;
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
我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的相关知识,请在本站寻找。
本文标签: