中国程序员联盟 正在重新改版中ing 不便之处还请见谅 改版后将内容涉及java delphi .net php
 
  首页 | 数据库开发 | 网络通讯 | 多线程 | 多媒体开发 | 图像处理 | 程序人生 | 系统函数 | 控件开发 | Web服务
 
  当前位置:笨鱼delphi技术网>网络通讯>文章内容

delphi 编写上网计费软件

来源:网络 关于:轶名 发布时间:2007-06-29   [收藏] [推荐]
 随着Internet的日益普及,到Internet网上冲浪的人是越来越多了,对于手头并不是很宽裕的网民特别是在家里上网的网民来说,如果能及时知道自己上网已经花了多少钱,那么,每次到ISP那缴纳费用时,至少可以做到心中有数。下面介绍一种非常方便的方法,根据这个方法的原理,用VB、Delphi之类的软件很容易很快编写出一个不错的个人Internet上网计费软件。

---- 工作原理

---- 现在一般个人上网,都是运行Windows 平台,采用Modem拨号上网方式,在Windows 中,配置“拨号服务器”时,拨号服务器有一个属性,就是是否记录日志文件,其默认值是“否”。对于它,平常我们可能都没太注意。我们把它改成“是”,这样,在每次上网后,Windows 就会在其安装目录下(通常就是C盘的Windows目录),把上网连通的时间以及上网过程中发生的事件记录在ppplog.txt日志文件中。

---- ppplog.txt是一个标准的文本文件,在此文件中,上网发生的每个事件记录占有一行,格式为:

 日期	   时间		发生的事件
|---------|-----------|-|---------------------|
12-19-1998 21:54:31.25 
- Microsoft 拨号网络适配器日志已打开。
12-19-1998 21:54:31.25
 - 服务器类型是 PPP (点到点协议)。
.
.
.
12-19-1998 22:44:49.08
 - Microsoft 拨号网络适配器日志已关闭。

---- 上述内容是简体中文Windows 98的ppplog.txt文件格式,对于Windows 95,基本格式是一样的,只是事件部分是英文的。

日期	   时间		发生的事件
|---------|-----------|-|---------------------|
12-15-1998 16:34:27.71 
- Remote access driver log opened.
12-15-1998 16:34:27.71 
- Installable CP VxD SPAP is loaded
12-15-1998 16:34:27.71
 - Server type is  PPP (Point to Point Protocol).
.
.
.
12-15-1998 16:58:30.05 
- Remote access driver log closed.

---- 对应于一次正常的上网过程,Windows 95/98必定会在ppplog.txt文件中记录下包括什么时候日志文件已打开以及什么时候日志文件已关闭的完整过程,这样,我们每次上网后读取ppplog.txt文件,把含有“日志已打开”字符串的事件记录的时间作为我们计时的起点,读取日期、时间,把含有“日志已关闭”字符串的事件记录的时间作为我们计时的结束(对于Windows 95,字符串分别取”log opened”和”log closed”),读取日期、时间,算出其时间差,以该时间差作为时长,按照市话费每三分钟算一次,每次0.24元,Internet费,每一分钟算一次,每次0.10元(我们这的收费标准),便可以算出每次的花费费用了。我们可以把每次计算的结果保存在一个数据库中,那么就可以随时查询自己的花费情况了。

---- 具体实现

---- 下面是我的具体实现过程,程序用Delphi编程实现。

---- 1、配置拨号服务器以便记录日志文件

---- 1.1、从任务栏上选取“开始”-〉“设置”-〉“控制面板”。

---- 1.2、点击“网络”图标,出现网络配置对话框。

---- 1.3、在网络组件中选择“拨号服务器”,按“属性”按钮,出现“拨号服务器”属性对话框。

---- 1. 4、选择其“高级”选项,然后选择“记录日志文件”项,在其右边的设置值中选择 “是”。按“确定”按钮,接着系统提示需要重新启动机器,重新启动后,设置就起作用了,以后每次上网,都会把上网时间记录在日志文件ppplog.txt文件中。

---- 2、 建立一数据库internet.db

---- 数据库用来保存每次的计费数据,方便查询。

---- 利用Delphi软件包中的DataBase DeskTop程序建立

---- 数据库中包含有下列字段:

字段名	类型	说明
Begindate	Date	起始日期
Begintime	Time	起始时间
Enddate	Date	结束日期
Endtime	Time	结束时间
Timelen	Number	时长
TelCost	Currency	电话费用
Ispcost	Currency	Internet费用

---- 3、从日志文件ppplog.txt文件中读取数据

---- 为了避免重复读取数据,可以每次从ppplog.txt文件中读完数据后,把ppplog.txt中的内容复制到ppplog.bak文件中,以便想查看日志文件时可以查看,然后,把ppplog.txt文件置空。读取的数据存放到数据库中。具体程序如下:

 procedure TForm1.readlogExecute(Sender: TObject);
 var
   logfile: TextFile;
   logbak: TextFile;
   Str1: string;
   datestr,timestr:string;
 begin
   AssignFile(logbak,'c:\windows\ppplog.bak');
   if not FileExists('c:\windows\ppplog.bak') then
      Rewrite(logbak)
   else
      Append(logbak);
   if not FileExists('c:\windows\ppplog.txt') then
       MessageDlg('日志文件不存在',
       mtInformation,[mbOk],0)
   else
     begin
     AssignFile(logfile, 'c:\windows\ppplog.txt');
     Reset(logfile);
     if Eof(logfile) then
     begin
        ShowMessage('日志文件已为空');
        Exit;
     end;
     Table1.Open;
     while not Eof(logfile) do
     begin
      Readln(logfile, Str1);
 {‘log opened’作为计时的起点}
      if Pos('log opened',Str1)< >0 then
      begin
        datestr:=copy(str1,1,10);
        timestr:=copy(str1,12,8);
        Table1.Append;
        Table1.FieldValues['begindate']
        := StrToDate(datestr);
        Table1.FieldValues['begintime']
        := StrToTime(timestr);
        Table1.Post;
      end;
 {‘log closed’作为计时的结束}
      if Pos('log closed',str1)< >0 then
      begin
        datestr:=copy(str1,1,10);
        timestr:=copy(str1,12,8);
        table1.Last;
        table1.Edit;
        Table1.FieldValues['enddate'] 
        := StrToDate(datestr);
        Table1.FieldValues['endtime']
        := StrToTime(timestr);
        Table1.Post;
      end;
      Writeln(logbak,str1);
     end;
     Table1.close;
     Rewrite(logfile);
     CloseFile(logfile);
     CloseFile(logbak);
    end;
   end;

---- 4、计算费用的过程

---- 在该过程中,对于Internet计费的半价问题(市话没有半价),只考虑到了晚上九点以后早上七点以前,对于节假日、星期六、星期天没有考虑,有兴趣的朋友可自我完善此程序。

procedure TForm1.calcostExecute(Sender: TObject);
var
  Year, Month, Day, Hour,
  Min, Sec, MSec: Word;
  Year1, Month1, Day1, Hour1,
   Min1, Sec1, MSec1: Word;
  tlen :  integer;
  tcost : Real;
begin
  Table1.open;
  while not Table1.Eof do
  begin
    {计算时长,以分钟为单位}
    if Table1Enddate.IsNull then
       tlen:=1
    else
     begin
       DecodeDate(Table1.FieldValues
       ['begindate'],year,month,day);
       DecodeDate(Table1.FieldValues
       ['enddate'],year1,month1,day1);
       DecodeTime(Table1.FieldValues
       ['begintime'],hour,min,sec,msec);
       DecodeTime(Table1.FieldValues
       ['endtime'],hour1,min1,sec1,msec1);
       tlen:=((((((day1-day)*24+hour1)
        -hour)*60+min1)-min)*60+sec1)-sec;
     end;
    if (tlen mod 60) > 0 then
       tlen:=tlen div 60 +1
    else
       tlen := tlen div 60;
    Table1.edit;
    Table1.FieldValues['timelen'] := tlen;
    {市话三分钟算一次}
    if (tlen mod 3) > 0 then
       tcost := (tlen div 3 + 1)*0.24
    else
       tcost := (tlen div 3)*0.24;
    Table1.FieldValues['telcost'] := tcost;
    if (hour >=21) or (hour< =7) then
       Table1.FieldValues['ispcost'] := tlen*0.05
    else
       Table1.FieldValues['ispcost'] := tlen*0.1;
    Table1.Next ;
  end;
  DbGrid1.Visible := True;
end;

---- 结束语

---- 通过上述过程,每次上网的费用都计算保存在数据库internet.db中,我们可以再编一段查询程序,这样便可以清楚地随时知道自己的上网花费了


[浏览: 次]   
上一篇:delphi 利用“侦听-转发”程序破译网管协议   下一篇:delphi 网络计算机信息
[收藏] [推荐] [返回顶部] [打印本页] [关闭窗口]  
    评论加载中…
google adsense热点文章
·delphi 学习WinSocket的编程
·delphi 用Delphi实现远程控制
·delphi 木马DIY
·delphi Delphi实现UDP广播
·delphi 检测计算机的 Internet 连接状
·delphi 获取BIOS信息
·delphi Base64编码转换
·delphi 发送raw IP类型的数据包
·delphi 使用ftp控件下载目录
·delphi 获取IP地址以及全部TCPIP连接的
·delphi 监测TCP IP协议是否安装了
·delphi Modem的指令
     delphi技术网 | firefox 下载 | Avant Browser下载 | dedecms 技术网 | drupal 爱好者 | php 技术网
  Copyright@www.delphichm.com,2006-2009.All Rights Reserved.
 
程序员联盟 | delphi Java .net|QQ:707102932