httpclientとマルチスレッドを使用してトラフィックコードをブラッシングします

歌うことから始まりました。歌う友達が少なく、訪問者が少なく、親戚や友達を追加したくないので、主に面倒なので、歌うアクセスメカニズムを考えて、使う準備をしました。 java httpclientライブラリトラフィックをスキャンし、動的IPの再利用を考えて、マルチスレッドを使用して更新することを考えましたが、速度が上がらなかったことがわかりました。それでも次のURLにURLをブラッシングしています。ここでのブラッシングの順序は次のとおりです。ランダム。主な問題はプロキシIPです。インターネット上で1,000を超えるIPを見つけました。それらの多くは応答が遅すぎるため、タイムアウトメカニズムを設定しました。一定期間を超えると、例外がスローされて無視されます。 。速度が遅すぎるため、改善する必要があります。改善のための良い提案を持っている人は誰でも共有してアドバイスを求めることを歓迎します。


注:以下は、初めて記述されたコードの最初のバージョンです。後で、コードの問題について考えました。実際のテストでは、スレッドが使用されているにもかかわらず、実際には役割を果たしていないことが判明したためです。問題は学習するための重要な方法でもあるため、改善。コードの最初のバージョンを変更せず、誰もが参照できるようにします。マルチスレッドブラッシングアクセスコードの改良版を後ろに掲載しましたが、このコードをテストしたところ、速度が大幅に向上していることがわかりました。結果は本物で効果的です!大声で笑う


以下のコードの最初のバージョンの欠陥の理由は以下のとおりです。

主に、最初にマルチスレッドプログラミングのstartメソッドとrunメソッドについて漠然と理解していたため、最初に2つの違いについて説明しましょう。

(1)スタート:

startメソッドを使用してスレッドを開始します。これにより、マルチスレッド操作が真に実現されます。これは、runメソッドコードの実行を待たずに、次のコードの実行を継続するためです。Threadクラスのstartメソッドを呼び出してスレッドを開始します。このスレッドは準備完了状態で実行されていません。CPUのタイムスライスが取得されると、runメソッドが実行されます。ここでの実行はスレッド本体になります。必要な内容が含まれていますこのスレッドのコンテンツが実行され、runメソッドが終了し、このスレッドが終了します。

(2)実行:

runメソッドはクラスの通常のメソッドです。runメソッドを直接呼び出すと、プログラムにはメインスレッドのみが残ります。プログラム実行パスは1つだけであるか、順次実行する必要があります。 runメソッドを実行した後、続行します。ファセットのコードを実行して、スレッドを書き込む目的が達成されないようにします。


したがって、コードの最初のバージョンでは、スレッドのstartメソッドが実行されるため、他のスレッドは生成されないため、マルチスレッドの目的は達成されません。



web_look.java

import java.io.*;
import java.util.*;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.cookie.CookiePolicy;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.http.params.CoreConnectionPNames;
import org.apache.http.params.HttpConnectionParams;

public class Web_look {
	
	public static void main(String[] args) throws IOException
	 {
		 int count=0;
		 Map<String,String> map =new HashMap<String,String>();
		 
		 FileReader reader=new FileReader("c://IP.txt");//读取代理IP地址
		 BufferedReader br=new BufferedReader(reader);
		 String str=null;
		 while((str=br.readLine())!=null)//格式写成IP+端口
		 {
			 String result[]=str.split("@");
			 String info[]=result[0].split(":");
			 map.put(info[0], info[1]);
		 }
		 Set<String> set=map.keySet();
		 Iterator<String> iter=set.iterator();
		 
		 
	     HttpClient client = new HttpClient();   
	     //设置超时时间
	     client.setTimeout(10000);
	     client.setConnectionTimeout(10000);
	     //设置cookie管理策略
	     client.getState().setCookiePolicy(CookiePolicy.COMPATIBILITY);
	     
	     while(iter.hasNext())//不断的取出IP和端口
	     {
	    	String key=iter.next();
			System.out.println(key+":"+map.get(key));
	    	//用try-catch来忽略超时异常继续执行
			try{
				//设置代理服务器地址和端口
			    client.getHostConfiguration().setProxy(key,Integer.parseInt(map.get(key)));
			    //这是用刷的是唱吧的访问量,亲测有效,只不过效率不是怎么高,因为代理服务器有快有慢,所以设置了超时机制。
			    //而且,貌似一个IP不能连续刷多首歌曲,所以就只能附带刷刷别的网页好了。
			    MyThread song1= new MyThread("http://changba.com/s/TKSPrlyJgkd4cUir8pGZkQ?code=Gt1bjDM0qnHCJdoHUPnwOOfDhUzYnTz-KfffnVr9zf7j8kkd7OlN9bo9NlHq5j6rFeHPZ8iGR3663XuAiDYOEcYV2ky5V8Bk",client);
			    MyThread song2= new MyThread("http://changba.com/s/48SlsCcpHNiNXPji_VyU5Q?code=Gt1bjDM0qnHCJdoHUPnwOOfDhUzYnTz-KfffnVr9zf7j8kkd7OlN9bo9NlHq5j6rFeHPZ8iGR3663XuAiDYOEcYV2ky5V8Bk",client);
//			    MyThread song3= new MyThread("http://changba.com/s/0GP_YQzqRJOJUHjDbRpPBg?code=Gt1bjDM0qnHCJdoHUPnwOOfDhUzYnTz-KfffnVr9zf7j8kkd7OlN9bo9NlHq5j6rFeHPZ8iGR3663XuAiDYOEcYV2ky5V8Bk",client);
//			    MyThread song4= new MyThread("http://changba.com/s/XXCW9aOqzkiQW1ha1hSMvg?code=Gt1bjDM0qnHCJdoHUPnwOOfDhUzYnTz-KfffnVr9zf7j8kkd7OlN9bo9NlHq5j6rFeHPZ8iGR3663XuAiDYOEcYV2ky5V8Bk",client);
//			    MyThread song5= new MyThread("http://changba.com/s/7HpyApA4gWXoh-V0usAMfw?code=Gt1bjDM0qnHCJdoHUPnwOOfDhUzYnTz-KfffnVr9zf7j8kkd7OlN9bo9NlHq5j6rFeHPZ8iGR3663XuAiDYOEcYV2ky5V8Bk",client);
//			    MyThread song6= new MyThread("http://changba.com/s/8y6IvXu-8uwUrrT7uEtHEA?code=Gt1bjDM0qnHCJdoHUPnwOOfDhUzYnTz-KfffnVr9zf7j8kkd7OlN9bo9NlHq5j6rFeHPZ8iGR3663XuAiDYOEcYV2ky5V8Bk",client);
//			    MyThread song7= new MyThread("http://changba.com/s/lyBc498kdr9N4DgR5lqFCg?code=Gt1bjDM0qnHCJdoHUPnwOOfDhUzYnTz-KfffnVr9zf7j8kkd7OlN9bo9NlHq5j6rFeHPZ8iGR3663XuAiDYOEcYV2ky5V8Bk",client);
			    
			    
			    song1.run();
			    song2.run();
//			    song3.run();
//			    song4.run();
//			    song5.run();
//			    song6.run();
//			    song7.run();

			    
			    
			    //使用GET方法,如果服务器需要通过HTTPS连接,那只需要将下面URL中的http换成https
				//使用POST方法 
			    //HttpMethod method = new PostMethod("http://changba.com/s/0yKWymXZXeGZcF0P3mM8Bg?code=Gt1bjDM0qnHCJdoHUPnwOOfDhUzYnTz-KfffnVr9zf7j8kkd7OlN9bo9NlHq5j6rFeHPZ8iGR3663XuAiDYOEcYV2ky5V8Bk"); 
			    //设置请求头,来模拟浏览器登陆,有些网站需要,有些网站不需要,看具体是什么网站了
//  		    method.setRequestHeader("Accept", "text/html,application/xhtml+xml,application/xml;"); 
//			    method.setRequestHeader("Accept-Language", "zh-cn"); 
//			    method.setRequestHeader("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3"); 
//			    method.setRequestHeader("Accept-Charset","encoding"); 
//			    method.setRequestHeader("Keep-Alive", "300"); 
//			    method.setRequestHeader("Connection", "Keep-Alive"); 
//			    method.setRequestHeader("Cache-Control", "no-cache"); 
			    
			    //client.executeMethod(method);
			    //打印服务器返回的状态
			    //System.out.println(method.getStatusLine());
			    //打印返回的信息
			    //System.out.println(method.getResponseBodyAsString());
			    //释放连接,否则会报错recycle
			    //method.releaseConnection();
			}catch(Exception e)
			{
				e.printStackTrace();
			}
			count++;
			System.out.println("第"+count+"个IP地址");
	     }
   }
}

Mythread.java

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.methods.PostMethod;


public class MyThread extends Thread{
	private String web_name;
	private HttpClient client;
	public MyThread(String web_name,HttpClient client)
	{
		this.web_name=web_name;
		this.client=client;
	}
	public void run()
	{
		HttpMethod method = new PostMethod(web_name);
		try
		{
			client.executeMethod(method);
			System.out.println(method.getStatusLine());
			System.out.println(method.getResponseBodyAsString());
			method.releaseConnection();
			
		}catch(Exception e)
		{
			e.printStackTrace();
			
		}
	}
}

ここでのマルチスレッドは、Sing Barの同じIPに複数の曲にアクセスするのは最初にアクセスするだけであるため、期待される効果はありません。したがって、複数のスレッドで記述されている場合でも、最初の曲だけがアクセスされます。曲への訪問数は1増加し、残りは変更されていません。したがって、他のページがある場合は、他のページをマルチスレッドに追加して更新できます。

------------------------------------------------ -分割線-----------------------------------------------------------— ———


以下に私の改善されたバージョンを投稿します。このバージョンは本当にマルチスレッドアクセスを実装し、より柔軟性があります。複数のスレッドを使用して同じまたは異なるWebページをスキャンしたり、異なるIPアドレスファイルを選択したりできます。

web_look.java

import java.io.*;
import java.util.*;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.cookie.CookiePolicy;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.http.params.CoreConnectionPNames;
import org.apache.http.params.HttpConnectionParams;

public class Web_look {
	
	public static void main(String[] args) throws IOException
	 {
		
			String web_name=null;
			web_name="http://changba.com/s/0yKWymXZXeGZcF0P3mM8Bg?code=Gt1bjDM0qnHCJdoHUPnwOOfDhUzYnTz-KfffnVr9zf7j8kkd7OlN9bo9NlHq5j6rFeHPZ8iGR3663XuAiDYOEcYV2ky5V8Bk";
	    	//用try-catch来忽略超时异常继续执行
			try{
				Thread threads[]=new Thread[5];
			    threads[0]= new Thread(new MyThread(web_name,"c://IP.txt"));
			    threads[1]= new Thread(new MyThread(web_name,"c://IP1.txt"));
			    threads[2]= new Thread(new MyThread(web_name,"c://IP2.txt"));
			    threads[3]= new Thread(new MyThread(web_name,"c://IP3.txt"));
			    threads[4]= new Thread(new MyThread(web_name,"c://IP4.txt"));
			   
			    for(int i=0;i<5;i++)
			    {
			    	threads[i].start();
			    }
			}catch(Exception e)
			{
				e.printStackTrace();
			}
	     }
}


MyThread.java

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.cookie.CookiePolicy;
import org.apache.commons.httpclient.methods.PostMethod;


public class MyThread implements Runnable{
	private String web_name;
	private String IP_file;
	private HttpClient client = new HttpClient();  
	private String str=null;
	private FileReader reader;
	private BufferedReader br;
	private Map<String,String> map =new HashMap<String,String>();
	
	public MyThread(String web_name,String IP_file)
	{
		this.web_name=web_name;
		this.IP_file=IP_file;
	}
	
	public void run()
	{
		
		try {
			reader=new FileReader(IP_file);
			br=new BufferedReader(reader);
		} catch (FileNotFoundException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}//读取代理IP地址
		try {
			while((str=br.readLine())!=null)//格式写成IP+端口
			 {
				 String result[]=str.split("@");
				 String info[]=result[0].split(":");
				 map.put(info[0], info[1]);
			 }
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		 Set<String> set=map.keySet();
		 Iterator<String> iter=set.iterator();
		    
	    //设置超时时间
	    client.setTimeout(10000);
	    client.setConnectionTimeout(10000);
	    //设置cookie管理策略
	    client.getState().setCookiePolicy(CookiePolicy.COMPATIBILITY);
	    
	    while(iter.hasNext())//不断的取出IP和端口
	     {
	    	String key=iter.next();
			System.out.println(key+":"+map.get(key));
			try
			{
				//设置代理服务器地址和端口
			    client.getHostConfiguration().setProxy(key,Integer.parseInt(map.get(key)));
			    //这是用刷的是唱吧的访问量,亲测有效,只不过效率不是怎么高,因为代理服务器有快有慢,所以设置了超时机制。
			    //而且,貌似一个IP不能连续刷多首歌曲,所以就只能附带刷刷别的网页好了。
			    
			}catch(Exception e)
			{
				e.printStackTrace();
			}
			HttpMethod method = new PostMethod(web_name);
			try
			{
				System.out.println(IP_file);
				client.executeMethod(method);
				
				//System.out.println(method.getStatusLine());
				//System.out.println(method.getResponseBodyAsString());
				method.releaseConnection();
				
			}catch(Exception e)
			{
				e.printStackTrace();
				
			}
	     }
	}
}




おすすめ

転載: blog.csdn.net/u012457196/article/details/37520033