我搜索了谷歌、这个网站和 JavaRanch,但找不到答案。
我的程序需要从选定的文件中获取代理(我使用 java gui FileChooser 类和 RandomAccessFile 完成了这一点)
然后我需要验证从 txt 文件中第一个开始的代理。它将尝试连接到某个站点或端口以验证连接是否成功。如果连接成功(我得到了肯定的响应),它将代理添加到代理列表中,然后获取并检查列表中的下一个直到完成为止。
我知道该怎么做,但我遇到了一个小问题。我的问题是这个过程需要独立于连接速度,因为有人可能会为要处理的连接设置 15000(毫秒)超时并设置 100 个线程,然后没有一个代理会因为连接太慢而工作。
我听说过一种叫做pinging的方法来检查代理,但我不知道如何在java中使用它。
任何人都可以给我解决方案或至少我可以使用的类(class)。
最佳答案
好的,我找到了一个解决方案,而且很简单。
我使用它的 InetAddress.isReachable()
方法以及 Apache 的一些 HttpClient
。对于代理检查,我使用了 blanksite.com
,因为我需要的只是检查连接能力而不是代理速度。
所以这是代码(包括来自文件的输入,但还不是 gui,还):
/* compile with
java -cp .;httpclient-4.5.1.jar;httpcore-4.4.3.jar ProxyMat
run with
java -cp .;httpclient-4.5.1.jar;httpcore-4.4.3.jar;commons-logging-1.2.jar ProxyMat
put one proxy to check per line in the proxies.txt file in the form
some.host.com:8080
*/
import java.io.File;
import java.io.FileNotFoundException;
import java.io.RandomAccessFile;
import java.net.InetAddress;
import org.apache.http.params.CoreConnectionPNames;
import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.conn.params.ConnRoutePNames;
import org.apache.http.impl.client.DefaultHttpClient;
public class ProxyMat{
File file=null;
static RandomAccessFile read=null;
public ProxyMat(){
file=new File("proxies.txt");
try {
read=new RandomAccessFile(file,"rw");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
public void checkproxies(){
try{
String line;
for(int i=0;i<25;i++){
if((line=read.readLine())!=null){
System.out.println(line);
String[] hp=line.split(":");
InetAddress addr=InetAddress.getByName(hp[0]);
if(addr.isReachable(5000)){
System.out.println("reached");
ensocketize(hp[0],Integer.parseInt(hp[1]));
}
}
}
}catch(Exception ex){ex.printStackTrace();}
}
public void ensocketize(String host,int port){
try{
File pros=new File("working.txt");
HttpClient client=new DefaultHttpClient();
HttpGet get=new HttpGet("http://blanksite.com/");
HttpHost proxy=new HttpHost(host,port);
client.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy);
client.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, 15000);
HttpResponse response=client.execute(get);
HttpEntity enti=response.getEntity();
if(response!=null){
System.out.println(response.getStatusLine());
System.out.println(response.toString());
System.out.println(host+":"+port+" @@ working");
}
}catch(Exception ex){System.out.println("Proxy failed");}
}
public static void main(String[] args){
ProxyMat mat=new ProxyMat();
mat.checkproxies();
}
}
关于java - 如何检查代理是否在 Java 中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8030908/