情况是这样的啊。
某个论坛的一个板块每天只允许发100个帖子(全部用户)。然后大家每天零点都用httpclient去发帖。
然后我用100个不同的用户一起发,但只能发10个,就禁止发了,因为还有其他两个人(我从每天发帖量分析出来的啊)也跟我一样用 软件发。但是我是最少的,他们两个人每天都可以发50,30的。我最多也就发15个。
我对httpclient做了下面的优化啊
getParams().setBooleanParameter("http.tcp.nodelay", true);

 setParameter("http.connection.stalecheck", false); setParameter("http.protocol.cookie-policy",
CookiePolicy.BROWSER_COMPATIBILITY);
而且我测试过如果发满100贴后,我请求10次(多线程)共耗时200毫秒,就可以返回我”当天帖量超最大值“
但是每天0点的时候,我请求10次(多线程)共耗时要5w~6w毫秒,我想是不是当时,服务器压力太大所以造成响应的很慢,但为什么其他的两个人总是比我多呢?是不是有什么设置可以让服务器优先选择的参数什么的呢?
我也设置了很多httpost.addHeader("Accept", "*/*");
httpost.addHeader(
"User-Agent",
"User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)"); httpost.addHeader("Accept-Language",
"zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3");
httpost.addHeader("Accept-Encoding", "gzip, deflate");
httpost.addHeader("Content-Type",
"application/x-www-form-urlencoded; charset=UTF-8");
httpost.setHeader("Connection", "keep-alive");
httpost.setHeader("Pragma", "no-cache");
httpost.setHeader("Cache-Control", "no-cache");也没有什么效果,现在一点思路也没有~难道是java本身不行吗?

解决方案 »

  1.   

    这个真的很难猜,可以由具体网站的独特业务逻辑设定的限制,不过比较可以肯定的是和java无关
      

  2.   


    确实可以1个ip不同用户发80个以上啊。这个论坛限制用户单位时间内发帖。但是不限制ip啊。这个肯定的啊
      

  3.   

    哦。是100个不同的用户同时发帖子啊。
    既然是0点才让发帖子,那么,你用户的登陆时间,就要提前了,别在人家发帖子的时候,你才开始登陆,登陆了再发,当然会落后了。
    你可以提前几分钟登陆论坛,然后,隔几秒激活一下HttpSession,
    到差1~2分钟就0点的时候,就开始发帖子,不成功就重新再发,知道0点过后的1~2分钟。你成功次数少,由4方面因素决定:
    首先是你的服务器,代码的质量问题;
    其次是论坛服务器的处理能力问题;
    第三是网络通畅与否的问题,如果你服务器的网络老是丢包,那么请求就变得缓慢了;
    最后是时间同步的问题,如果你的本地时间总比论坛服务器慢那么几秒,你就啥也别想争了,计算机,玩的是毫秒。
      

  4.   

    可能没有表达清楚。这个论坛的某个版块1天最多能发100个帖子啊。
    1个用户1天不能超过10个帖子。
    对ip没有限制。
    这三点是肯定的啊。
    我实际观察到的现象是,这100个帖子的量每天都是我们三个人发的。
    但是我只每天大概10~15个
    剩下两个人分85-90~他们两个没准谁会多啊。反正我的最少每天都这样。我想肯定是我程序的问题要不就是java的问题啊
      

  5.   


    说的很对啊但是这几个地方我都注意到了 1.首先是你的服务器,代码的质量问题;
     a: 这个服务器不是我的啊,这个是一个论坛的服务器,我只是用httpclient模拟发帖而已啊。如果您说的是我的httpclient代码质量。
     那确实有可能啊。求加个q指导一下啊!不过代码很少超不过50行。应该也不太会有问题吧。
     
     
     2。其次是论坛服务器的处理能力问题;
     a:这个处理能力问题,不是问题啊,因为别人为什么每次都比我多好几倍呢?
     
     3。第三是网络通畅与否的问题,如果你服务器的网络老是丢包,那么请求就变得缓慢了;
     a:这个我怎么测试丢包情况呢?另外我们这里网络情况特好理论上不会啊。但是我还是会确认一下啊。
     
     
     4。最后是时间同步的问题,如果你的本地时间总比论坛服务器慢那么几秒,你就啥也别想争了,计算机,玩的是毫秒。 
     a:这个问题不会啊,因为我是跟国家队对时中心同步的,而这个论坛也是这样做的。
     
     5。你可以提前几分钟登陆论坛,然后,隔几秒激活一下HttpSession,
     b:这个问题我现在就是提前登陆的啊,只是我没有激活session,我总是提前3分钟登陆,然后登陆上去就开始发贴,只是没到0点前都返回的是今天发帖数目已满而已。到了0点后
     才开始出现成功的线程啊。 
     
      

  6.   

    sorry,应该是我没看清楚那如果每次对方发帖都比你多,论坛对所发帖子有时间记录吧,对方的最后一帖和你的最后一帖时间差多少?也再看一下第一帖的差异,通过这两组数据可以分析出一些问题
      

  7.   

    我生成了x个HttpClient,和x个HttpPost 然后用线程池执行
    private ThreadPoolExecutor threadPool = new ThreadPoolExecutor(20, 25,25,
    TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(20),
    new ThreadPoolExecutor.CallerRunsPolicy());
    for (int i=0;i<21;i++) {
    threadPool.execute(new ThreadPoolTask(HttpClientList.get(i), HttpPostList.get(i)));
    }[13 19:30:51.909]#Thread.Id:[28]#..........##Url耗时:470 .毫秒
    [13 19:30:55.569]#Thread.Id:[30]#..........##Url耗时:4080 .毫秒
    [13 19:30:55.569]#Thread.Id:[41]#..........##Url耗时:4070 .毫秒
    [13 19:30:55.569]#Thread.Id:[27]#..........##Url耗时:4140 .毫秒
    [13 19:30:55.679]#Thread.Id:[39]#..........##Url耗时:4180 .毫秒
    [13 19:30:55.899]#Thread.Id:[37]#..........##Url耗时:4400 .毫秒
    [13 19:30:59.129]#Thread.Id:[36]#..........##Url耗时:7610 .毫秒
    [13 19:30:59.139]#Thread.Id:[50]#..........##Url耗时:7640 .毫秒
    [13 19:30:59.139]#Thread.Id:[38]#..........##Url耗时:7640 .毫秒
    [13 19:30:59.359]#Thread.Id:[43]#..........##Url耗时:7860 .毫秒
    [13 19:31:02.709]#Thread.Id:[47]#..........##Url耗时:11210 .毫秒
    [13 19:31:02.709]#Thread.Id:[46]#..........##Url耗时:11210 .毫秒
    [13 19:31:02.719]#Thread.Id:[42]#..........##Url耗时:11220 .毫秒
    [13 19:31:02.909]#Thread.Id:[53]#..........##Url耗时:11410 .毫秒
    [13 19:31:06.229]#Thread.Id:[49]#..........##Url耗时:14730 .毫秒
    [13 19:31:06.239]#Thread.Id:[55]#..........##Url耗时:14740 .毫秒
    [13 19:31:06.289]#Thread.Id:[35]#..........##Url耗时:14790 .毫秒
    [13 19:31:06.439]#Thread.Id:[45]#..........##Url耗时:14940 .毫秒
    [13 19:31:09.769]#Thread.Id:[56]#..........##Url耗时:18240 .毫秒
    [13 19:31:09.769]#Thread.Id:[51]#..........##Url耗时:18270 .毫秒我发现执行效果大概是每4个一组,启动时间依此增加,每次差不多有5秒的间隔这个间隔太长了,我不知道是我哪里写错了。还是httpclient 和 HttpPost 有什么特性呢?
      

  8.   

    我生成了x个HttpClient,和x个HttpPost 然后用线程池执行
    private ThreadPoolExecutor threadPool = new ThreadPoolExecutor(20, 25,25,
    TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(20),
    new ThreadPoolExecutor.CallerRunsPolicy());
    for (int i=0;i<21;i++) {
    threadPool.execute(new ThreadPoolTask(HttpClientList.get(i), HttpPostList.get(i)));
    }[13 19:30:51.909]#Thread.Id:[28]#..........##Url耗时:470 .毫秒
    [13 19:30:55.569]#Thread.Id:[30]#..........##Url耗时:4080 .毫秒
    [13 19:30:55.569]#Thread.Id:[41]#..........##Url耗时:4070 .毫秒
    [13 19:30:55.569]#Thread.Id:[27]#..........##Url耗时:4140 .毫秒
    [13 19:30:55.679]#Thread.Id:[39]#..........##Url耗时:4180 .毫秒
    [13 19:30:55.899]#Thread.Id:[37]#..........##Url耗时:4400 .毫秒
    [13 19:30:59.129]#Thread.Id:[36]#..........##Url耗时:7610 .毫秒
    [13 19:30:59.139]#Thread.Id:[50]#..........##Url耗时:7640 .毫秒
    [13 19:30:59.139]#Thread.Id:[38]#..........##Url耗时:7640 .毫秒
    [13 19:30:59.359]#Thread.Id:[43]#..........##Url耗时:7860 .毫秒
    [13 19:31:02.709]#Thread.Id:[47]#..........##Url耗时:11210 .毫秒
    [13 19:31:02.709]#Thread.Id:[46]#..........##Url耗时:11210 .毫秒
    [13 19:31:02.719]#Thread.Id:[42]#..........##Url耗时:11220 .毫秒
    [13 19:31:02.909]#Thread.Id:[53]#..........##Url耗时:11410 .毫秒
    [13 19:31:06.229]#Thread.Id:[49]#..........##Url耗时:14730 .毫秒
    [13 19:31:06.239]#Thread.Id:[55]#..........##Url耗时:14740 .毫秒
    [13 19:31:06.289]#Thread.Id:[35]#..........##Url耗时:14790 .毫秒
    [13 19:31:06.439]#Thread.Id:[45]#..........##Url耗时:14940 .毫秒
    [13 19:31:09.769]#Thread.Id:[56]#..........##Url耗时:18240 .毫秒
    [13 19:31:09.769]#Thread.Id:[51]#..........##Url耗时:18270 .毫秒我发现执行效果大概是每4个一组,启动时间依此增加,每次差不多有5秒的间隔这个间隔太长了,我不知道是我哪里写错了。还是httpclient 和 HttpPost 有什么特性呢?