【问题标题】:How to check if proxy is working in Java?如何检查代理是否在 Java 中工作?
【发布时间】:2011-12-23 06:33:59
【问题描述】:

我搜索了 google、this site 和 JavaRanch,但找不到答案。

我的程序需要从选定的文件中获取代理(我使用 java gui FileChooser 类和 RandomAccessFile 完成了)

然后我需要从 txt 文件中的第一个代理开始验证代理。它将尝试连接到某个站点或端口以验证连接是否成功。如果连接成功(我得到了肯定的响应),它将代理添加到代理列表中,然后获取并检查列表中的下一个直到完成。

我知道该怎么做,但我遇到了一个小问题。我的问题是这个过程需要独立于连接速度,因为有人可能会为要处理的连接设置 15000(毫秒)超时并设置 100 个线程,然后由于连接太慢,所有代理都不会工作。

我听说过一种叫pinging的方法来检查代理,但是我不知道如何在java中使用它。

谁能给我解决方案或至少我可以使用的课程。

【问题讨论】:

  • 您的ping 检查可能并不比仅仅打开到代理的连接并尝试使用它好很多。最好切换到非阻塞 IO 或限制可以创建的线程数,以免网络连接不堪重负。
  • @samold 一点都不好,反而更糟。
  • 问题是我没有使用 ping 检查我刚刚提到它。我不知道如何使用它。所以我听说这可以通过套接字完成(在其他一些代理检查器软件上看到)但我无法获得他们的源代码。如果可以的话,可以用套接字来完成吗?
  • 谁是可以设置 15 秒连接超时的“某人”,如果您也有 100 个线程,为什么会有问题?您希望检查多少个代理?
  • Somone 将是一个软件用户,问题会是这样的。想象一下有人像我一样有 2mbit/s 的连接并设置了 15 秒的超时时间,并设置了 100 个线程。你认为他们可以打开 100 个站点吗?这种连接需要 15 秒?我希望每 15 秒检查至少 100 个代理

标签: java sockets networking proxy connection


【解决方案1】:

好的,我找到了解决方案,很简单。

我使用了 InetAddress.isReachable() 方法以及 Apache 的一些 HttpClient。对于代理检查,我使用了blanksite.com,因为我只需要检查可连接性而不是代理的速度。

所以这里是代码(包括来自文件的输入,但它不是 gui,YET):

/* 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();
    }
}

【讨论】:

  • client.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, ,proxy);缺少一个参数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 2015-08-23
  • 1970-01-01
相关资源
最近更新 更多