需要做一个小项目,网站流量统计。需求是:
1.以天为单位,创建XML文件,存储到访用户信息(IP,IE版本,系统版本)
2.用线程把XML以每小时存到数据库
3.用GDI+绘图,以柱状,折线图显示网站流量关键字:线程,XML,GDI+请问大家具体该怎么做?

解决方案 »

  1.   

    使用Request.ServerVariables来取得用户的信息,
      

  2.   

    给你个链接看看吧 
    http://www.cnblogs.com/ajaxren/archive/2007/05/15/747789.html
      

  3.   

    其实可以用绘图控件 甚至免费的都有 比如webChart 足可以应付你的绘图+数据库
      

  4.   

    用yahoo.com.cn 的流量统计或者www.cnzz.com 网站提供的功能来统计.
      

  5.   

    其实我有点点思路,大家帮忙看看:
    1.写一个程序,每天创建一个xml文件,文件名如"20080408.xml"
    2.写一个程序,获取来访用户信息(IP,IE版本...),并随时把来访的所有用户存到今天的这个XML文件中
    3.绘制柱状,折线图来显示每天24小时来访人数
    4.用线程,设置每隔1小时把XML中的来访用户信息存入数据库保存不知道大家觉得怎么样,请给点意见或者提示,本人确实对这个不怎么了解
      

  6.   

    俄,我觉得这个已经不是小项目了呵呵,在xml方面,建议你看这个书,Asp.Net 2.0 xml高级编程
      

  7.   

    就是为了做一个访问人数统计,把每天每个小时的访问总人数用柱状,折线图来显示
    把访问者的信息现存到XML中,然后线程定期存到数据库中,这样是为了避免用户访问用户人数过多,操作数据库的时候造成很慢,所以选择了先把来访者信息存到XML中,再用线程定期存到数据库中我只是把我对这个的认识说一下,至于这个完整的思路是什么,请大家都来说一下
      

  8.   

    ...你写文件也慢的.直接存到数据库里好了.省得麻烦.
    rdlc报表做图.
      

  9.   

    你这个功能已经不小了;首先需要分解为3个模块:
    1、记录每个人访问信息;(这个建议使用数据库来实现,需要考虑的就是多次刷新的问题)
    2、统计每个小时的流量,计算好以后生成xml文件;
    3、实现图表显示;(这个你去找找网上现成的com控件,服务器上安装一下使用么好了)用线程这个不是很搞得清楚你要实现什么,或者就是你的思路有问题;
      

  10.   

    我先考虑的是先把访问者的信息存到XML中,然后采用线程定期把XML中的信息存到数据库中,然后多次刷新的时候页是读取XML中的信息
    我也不知道我这个想法可行不?
      

  11.   

    建议直接存数据库.刷新的问题用cache好了.
      

  12.   

    如果直接存到数据库之后,那还需要XML吗?
     
      

  13.   

    其他的统计已经做的很好了,自己没有做了----------------------------------
    中国无忧商务网-无忧商务 商务无忧
    www.cn5135.com
      

  14.   

    那照这么说,XML也没有必要要了,线程也不比用了第一步的基本思路是:1.记录每个访问者的信息,马上存到数据库中缓存又该怎么存?
    哪么后面的读取信息,显示除柱状图,折线图又该怎么办?
      

  15.   

    可以搜一下 阿江 的流量统计系统
    -------------------------------------------
    3.用GDI+绘图,以柱状,折线图显示网站流量 
    一图形显示不一定非歹GDI+绘图,可以控制图片宽度显示。
      

  16.   

    没有乱啊.直接记到数据库,然后用rdlc绘图.
      

  17.   

    本来昨天研究了GDI+
    今天又要来研究rdlc了又是以头雾水...
      

  18.   

    以上说的都很全了,一般你要实现的画图显示,完全可以使用别人提供的工具等来完成。
    和别还要自己费时开发?而且开发的没有人家的好运,美观,耐用等。
    8楼的兄弟说的:webChart 足可以应付你的绘图+数据库  就很对。很好用。你所的几步,也就是几个类就可以。
      

  19.   

    下面是我写过的柱图和饼图的两个例子 还有折线图的我没帖过来 大同小异using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using System.Drawing;
    using System.Drawing.Drawing2D;
    using BLL;
    using ObjectInfo;
    using WebChart;
    using System.Globalization;public partial class Analysis_ChartProfit : BasePage
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                BasePage.Control.BindDicList(ddlType, "chartTypeStruct", 0);
                lbTip.Text = "[" + System.DateTime.Now.ToString("yyyy-MM-dd") + "]";
            }
            myChart.Charts.Clear();
            switch (ddlType.SelectedValue.ToLower())
            {
                case "column":
                    DrawColumn();
                    break;
                case "pie":
                    DrawPie();
                    break;
                default:
                    Javascript.Alert("显示参数未正确定义");
                    break;
            }
        }
        #region 饼图
        protected void DrawPie()
        {
            Color[] cl;
            float startPoint = 0;
            ChartPointCollection data = GetData(out cl, ref startPoint,true);
            PieChart pc = new PieChart(data);
            //pc.Fill.StartPoint = new Point(150, 300);
            pc.Colors = cl;
            pc.ShowLineMarkers = false;
            ChartShadow cs = pc.Shadow;
            cs.OffsetX = 2;
            cs.OffsetY = 4;
            cs.Color = Color.Gray;
            cs.Visible = true;
            pc.Legend = "资产总量分析图";
            pc.ShowLegend = true;
            ChartDataLabels cdl = pc.DataLabels;
            cdl.ShowZeroValues =true;
            
            cdl.Position = DataLabelPosition.Center;
            cdl.ShowLegend = false;
            cdl.ShowXTitle = false;
            cdl.ShowValue = true;        
            NumberFormatInfo ni = new NumberFormatInfo();
            cdl.NumberFormat = "#0.##" + "'%";
            cdl.Visible = true;
            pc.Explosion = 0;
            System.Drawing.Point p1 = pc.Fill.StartPoint;
            System.Drawing.Point p2 = pc.Fill.EndPoint;
            myChart.Charts.Add(pc);
            
            myChart.ChartPadding = 0;
            myChart.LeftChartPadding = 0;
            myChart.ShowXValues = true;
            myChart.ShowTitlesOnBackground = false;
            myChart.YCustomStart = (float)0.01;
            myChart.Width = 750;
            myChart.Height = 550;
            myChart.Legend.Width = 140;
            myChart.RedrawChart();                
        }
        #endregion    #region 柱图
        protected void DrawColumn()
        {
            Color[] cl;
            float startPoint = 0;
            ChartPointCollection data = GetData(out cl,ref startPoint, false);
            myChart.YCustomStart = 0;
            ColumnChart c = new ColumnChart(data);
            c.Fill.Color = Color.Gray;
            c.Fill.Type = InteriorType.Hatch;
            c.Fill.HatchStyle = HatchStyle.DottedDiamond;
            c.Fill.ForeColor = Color.LightBlue;
            c.Line.Color = Color.White;
            c.MaxColumnWidth = 100;
            c.ShowLegend = false;
            c.DataLabels.ForeColor = Color.White;
            c.DataLabels.NumberFormat = "¥0.00";
            c.DataLabels.Position = DataLabelPosition.Top;
            c.DataLabels.Background.Color = Color.SteelBlue;
            c.DataLabels.ShowXTitle = false;
            c.DataLabels.ShowValue = true;
            c.DataLabels.Border.Color = Color.Red;
            c.DataLabels.Separator = " ";
            c.DataLabels.ShowLegend = false;
            c.DataLabels.MaxPointsWidth = 1;
            c.DataLabels.Visible = true;
            c.ShowLineMarkers = true;
            c.DataLabels.ShowZeroValues = true;        ChartShadow cs = c.Shadow;
            cs.OffsetX = 5;
            cs.OffsetY = 4;
            cs.Color = Color.LightSlateGray;
            cs.Visible = true;
            myChart.YTitle.Text = "万元";
            myChart.YTitle.StringFormat.Alignment = StringAlignment.Near;
            //myChart.YTitle.StringFormat.LineAlignment = StringAlignment.Far;
            myChart.YTitle.StringFormat.FormatFlags = StringFormatFlags.DirectionRightToLeft;        
            //myChart.YCustomEnd = 0;
            myChart.Width = 750;
            myChart.Height = 550;
            myChart.TopChartPadding = 10;
            myChart.LeftChartPadding = 30;
            myChart.BottomChartPadding = 20;
            myChart.ShowXValues = true;
            myChart.Legend.Width = 0;
            myChart.ShowTitlesOnBackground = false;
            myChart.Charts.Add(c);
            myChart.RedrawChart();
        }
        #endregion    #region 取数据
        protected ChartPointCollection GetData(out Color[] cl,ref float startPoint,bool showPercent)
        {
            DataTable dtType = BLL.Query.AssetTypeInfo();
            QProfitInfo p = new QProfitInfo();        
            DataTable dtData = BLL.Query.AssetProfit(p);
            ChartPointCollection data = new ChartPointCollection();
            Color[] cls = CommonFunc.AssetTypeColors();
            cl = new Color[dtType.Rows.Count];
            float total = (dtData.Compute("sum(fee)", "true")==DBNull.Value?0:Convert.ToSingle(dtData.Compute("sum(fee)", "true")))/10000;
            bool minValue = false;
            for(int i=0;i<dtType.Rows.Count;i++)
            {
                cl[i] =cls[i];
                string minCode = dtType.Rows[i].IsNull("minCode") ? "00" : dtType.Rows[i]["minCode"].ToString()+"-00000";
                string maxCode = dtType.Rows[i].IsNull("maxCode") ? "00" : dtType.Rows[i]["maxCode"].ToString() + "-00000";            
                DataRow[] dr = dtData.Select("fstrAssetName>='" + minCode + "' AND fstrAssetName<='" + maxCode + "'");
                string name = dtType.Rows[i].IsNull("lb") ? "00" : dtType.Rows[i]["lb"].ToString();
                object v = dtData.Compute("sum(fee)", "fstrAssetName>='" + minCode + "' AND fstrAssetName<='" + maxCode + "'");
                float f = Convert.ToSingle(v ==DBNull.Value ? 0 : v) / 10000;
                ChartPoint cp = new ChartPoint(f<0?name+"-(负)":name, showPercent?f*100/total:f);            
                data.Add(cp);
                startPoint = startPoint > f ? f : startPoint;            
            }
            if(startPoint>0.01)
            {
                startPoint *= 1.5F;
            }
            return data;
        }
        #endregion
    }
      

  20.   

    其实不难,如果你觉得有雾,那你就该先看看线程如何工作,xml如何操作,gdi
    +是个啥东西!
      

  21.   


    我个人觉得看你网站流量大小,流量小DB,XML足够了,流量大的话可以考虑用消息队列,统计图可以考虑用开原的一个控件ZedGraph 或者购买infragistics。另外数据量大的话建议每天都新建一张表
      

  22.   

    建议楼主使用 www.cnzz.com 、 www.51yes.com 之类的免费统计,项目多,图表、图形表现也比较丰富。图片可下载,图表可导出为Excel。真要自己做下来,不是一个小工具就能搞定的。
      

  23.   

    如果只是自己的网站--只要在前台嵌入js脚本就可以了---(你可以在firefox下安装firebug--然后查看dom结构--这里有你需要的客户端所有的信息-- 或者在.aspx.cs ---中    System.Collections.Specialized.NameValueCollection ServerVariables = System.Web.HttpContext.Current.Request.ServerVariables;
            strvip = ServerVariables["REMOTE_ADDR"].ToString();-- 这个是显示ip的--也可以用循环把键值对全部输出看一下- 
      

  24.   

    ...没有手边的例子.跟你存到数据库是一样的.你操作数据库如果不用reader的话不是一样要fill一个DataTable或DataSet的吗.你弄个DataTable或DataSet存到Application["your_DataTable"]里就可以了:Application["your_DataTable"] =dt //dt是DataTable
    要查询的时候取出来:
    DataTable dt=Application["your_DataTable"] as DataTable
    //然后用Linq to DataTable 或者其他方法查询
      

  25.   

    还是不太明白怎么实现的统计每天,每小时访问的人数
    这些都是再Global.asax.cs里操作吧
      

  26.   

    你只要把用户访问时间和IP记录在表里就可以了.
    不一定要在global里写.在Page_Load里记录到表上就可以了.
    要查看统计表就在那个page的page_Load里查询表,然后绑GridView.如果要显示图片稍微麻烦一点.可以用GDI+绘图.
      

  27.   

    可以参考一下无忧统计,里面有很多基础一点的知识。还可以获取源码进行分析。http://www.51stats.com/