汤姆大叔抢书程序之java版

本文探讨了在并发环境下利用Apache HttpClient组件提交HTTP请求的优化方法,并提供了具体代码实现及性能测试,旨在提升请求响应速度。

 SingletonClient.getHttpClient().execute(post2,localContext);这里是采用httpclient组件提交http请求,需要导入相应的依赖

<!--  httpclient  -->
     < dependency >
       < groupId >org.apache.httpcomponents </ groupId >
       < artifactId >httpclient </ artifactId >
       < version >4.2.1 </ version >
     </ dependency >
     < dependency >
       < groupId >org.apache.httpcomponents </ groupId >
       < artifactId >httpcore </ artifactId >
       < version >4.2.1 </ version >
     </ dependency >
    
     < dependency >
       < groupId >org.apache.httpcomponents </ groupId >
       < artifactId >httpmime </ artifactId >
       < version >4.2.1 </ version >
     </ dependency >
    
     < dependency >
       < groupId >org.apache.httpcomponents </ groupId >
       < artifactId >httpclient-cache </ artifactId >
       < version >4.2.1 </ version >
     </ dependency >
    
     < dependency >
       < groupId >org.apache.httpcomponents </ groupId >
       < artifactId >fluent-hc </ artifactId >
       < version >4.2.1 </ version >
     </ dependency >
    
     < dependency >
       < groupId >commons-codec </ groupId >
       < artifactId >commons-codec </ artifactId >
       < version >1.6 </ version >
     </ dependency >

     < dependency >
       < groupId >commons-logging </ groupId >
       < artifactId >commons-logging </ artifactId >
       < version >1.1.1 </ version >

    </dependency> 

工具类SingletonClient.java

 public class SingletonClient {    

     
     private  static  final String CHARSET = "UTF-8";  
     private  static HttpClient singleHttpClient;  
  
     private SingletonClient() {  
    }  
  
     public  static  synchronized HttpClient getHttpClient() {  
         if ( null == singleHttpClient) {  
             // exe = Executors.newFixedThreadPool(POOL_SIZE);
            
            HttpParams params =  new BasicHttpParams();  
            HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);  
            HttpProtocolParams.setContentCharset(params, CHARSET);  
            HttpProtocolParams.setUseExpectContinue(params,  true);  
            HttpProtocolParams  
                    .setUserAgent(  
                            params,  
                            "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 GTB6 (.NET CLR 3.5.30729)");           
             /*  连接超时  */  
            HttpConnectionParams.setConnectionTimeout(params, 5000);  
             /*  请求超时  */  
            HttpConnectionParams.setSoTimeout(params, 5000);  
  
             //  设置HttpClient支持的请求模式  
            SchemeRegistry schReg =  new SchemeRegistry();  
            schReg.register( new Scheme("http", 80, PlainSocketFactory  
                    .getSocketFactory()));  
            schReg.register( new Scheme("https", 443, SSLSocketFactory  
                    .getSocketFactory()));  
             //  在最新版本的httpclient中ThreadSafeClientConnManager已被@Deprecated掉,这里使用PoolingClientConnectionManager。  
            
// ClientConnectionManager conMgr = new PoolingClientConnectionManager(schReg);  
            PoolingClientConnectionManager conMgr =  new PoolingClientConnectionManager(schReg);  
            conMgr.setMaxTotal(10);
             // HttpHost localhost = new HttpHost("locahost", 80);
            
// conMgr.setMaxPerRoute(new HttpRoute(localhost), 50);
            
            singleHttpClient =  new DefaultHttpClient(conMgr, params);
            
        }  
         return singleHttpClient;  
    }
}

UserContext .java

public  class UserContext {

     /**
     * 
@param  args
     
*/
     public  static  void main(String[] args) {
         //  TODO Auto-generated method stub        
         final HttpContext localContext=initContext();        
         try {
            Thread.sleep(1000);
        }  catch (InterruptedException e1) {
             //  TODO Auto-generated catch block
            e1.printStackTrace();
        }

         List<BasicNameValuePair> list2=  new ArrayList<BasicNameValuePair>();
            list2.add( new BasicNameValuePair("__VIEWSTATE","/wEPDwUJNDYwODU2NjU1ZGQ="));            
            list2.add( new BasicNameValuePair("txbComment","我跟你拼了  哈哈"));
            list2.add( new BasicNameValuePair("btnSubmint","提交评论"));
              final HttpPost post2=SingletonClient.getPost("http://m.cnblogs.com/mobileAddComment.aspx?id=101461&entry=2733027", list2);
             
            Thread mythread= new Thread( new Runnable(){
              int minute=59;
              int second=16;
              int millisec=400;
                @Override
                 public  void run() {
                     //  TODO Auto-generated method stub
                    SimpleDateFormat sdf2= new SimpleDateFormat("yyyy年MM月dd日hh时mm分ss秒SSS毫秒");
                     // int sec=0;
                     while( true)
                    {
                        
                         if(Calendar.getInstance().get(Calendar.MINUTE)==minute&&Calendar.getInstance().get(Calendar.SECOND)==second&&Calendar.getInstance().get(Calendar.MILLISECOND)>millisec)
                        {
                             try {
                                 long start=System.currentTimeMillis();                                
                                HttpResponse httpResponse1 = SingletonClient.getHttpClient().execute(post2,localContext);
                                System.out.println("响应代码1"+httpResponse1.getStatusLine().getStatusCode());
                                 long end=System.currentTimeMillis();
                                System.out.println("往返响应时间:"+(end-start));                                
                                 break;
                                
                            }  catch (ClientProtocolException e) {
                                 //  TODO Auto-generated catch block
                                e.printStackTrace();
                            }  catch (IOException e) {
                                 //  TODO Auto-generated catch block
                                e.printStackTrace();
                            }                                
                             break;                            
                        }
                        System.out.println(sdf2.format( new Date()));
                        
                    }
                    
                }
                
            });            
            mythread.start();
    }
     public  static HttpContext initContext()
    {
        List<BasicNameValuePair> list=  new ArrayList<BasicNameValuePair>();    
        
        list.add( new BasicNameValuePair("__EVENTTARGET",""));
        list.add( new BasicNameValuePair("__EVENTARGUMENT",""));
        list.add( new BasicNameValuePair("__VIEWSTATE","/wEPDwULLTE1MzYzODg2NzZkGAEFHl9fQ29udHJvbHNSZXF1aXJlUG9zdEJhY2tLZXlfXxYBBQtjaGtSZW1lbWJlcm1QYDyKKI9af4b67Mzq2xFaL9Bt"));
        list.add( new BasicNameValuePair("__EVENTVALIDATION","/wEWBQLWwpqPDQLyj/OQAgK3jsrkBALR55GJDgKC3IeGDE1m7t2mGlasoP1Hd9hLaFoI2G05"));
        list.add( new BasicNameValuePair("tbUserName","你的用户名"));
        list.add( new BasicNameValuePair("tbPassword","你的密码"));
        list.add( new BasicNameValuePair("btnLogin","登录"));
        
        HttpPost post=SingletonClient.getPost("http://passport.cnblogs.com/login.aspx", list);
        
         //  创建一个本地Cookie存储的实例  
        CookieStore cookieStore =  new BasicCookieStore();  
         // 创建一个本地上下文信息  
        HttpContext localContext =  new BasicHttpContext();  
         // 在本地上下问中绑定一个本地存储  
        localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);  
        
         try {
            
            HttpResponse httpResponse = SingletonClient.getHttpClient().execute(post,localContext);
            String status="初始化失败";    
             if(httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_MOVED_TEMPORARILY )            {                
                status="初始化成功";                
            }
             //  Do not feel like reading the response body
            
//  Call abort on the request object
            post.abort();
            System.out.println(status);
             
        }  catch (ClientProtocolException e) {
             //  TODO Auto-generated catch block
            e.printStackTrace();
        }  catch (IOException e) {
             //  TODO Auto-generated catch block
            e.printStackTrace();
        }
         return localContext;
        
    }
    

优化建议:

其实现在抢书已经拼到了毫秒级,单靠这种单用户一次性提交抢到书的几率还是不大的

 

 所以建议修改程序,增加几个HttpContext实例(多用户,我借用了朋友一个帐号),在main函数里面,执行几个 SingletonClient.getHttpClient().execute(post2,localContext);方法

SingletonClient.getHttpClient().execute(post2,localContext1);

SingletonClient.getHttpClient().execute(post2,localContext2);

SingletonClient.getHttpClient().execute(post2,localContext3);

…… 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值