java - 如何检查代理是否在 Java 中工作?

标签 java sockets networking proxy connection

我搜索了谷歌、这个网站和 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/

相关文章:

Java正则表达式查找十六进制字符串

java - WINE可以在Linux下打开独立的Windows应用程序吗?

java - 为什么 Java 尝试验证证书路径,尽管我明确设置了一个不验证任何证书的信任管理器?

c++ - Windows 中 SO_RCVBUF 的最大值?

networking - 是否在路径中的每个路由器上检查 IP 校验和?

java - 使用 DatagramSocket 时端口无法访问

java - 自定义布局的Android ArrayAdapter问题

用于 URL 的 java.nio.file.Path?

c - 我应该在我的应用程序关闭时关闭套接字吗?

python - Python如何访问socket()等OS API函数?