HomePage中制作计数器的若干方法
设计一个漂亮吸引网友的主页,这是很普遍的想法。你是否需要知道有多少人看了你的信息呢?该文告诉你一些基本方法。在一些Web站点的HomePage中,设置了计数器来指示有多少用户已经访问了此页面,这可以使读者了解到此页面受到欢迎的程度。因此越来越多的HomePage中加入了这项功能。我们如何在自己的HomePage中实现计数器功能呢?以下是作者在实践中得出的几种方法。
一、使用HTTP协议和CGI程序的方法
例如有以下HTML文件:
<html>
<body>
<center>
<img src="welcome.gif"><p>
<h2><strong>您是第 <IMG SCR=" /cgi-bin/counter1.exe">
位访问者</strong></h2 >
</center>
</body>
</html>
它所显示的Web页面如图1。
图1 Web页面(1)
我们看到在HTML文档中有以下语句:<IMG SCR=" /cgi-bin/counter1.exe">,浏览器解释它时,通过HTTP协议向Web服务器请求图像,Web服务器启动虚拟目录/cgi-bin下的CGI程序co unter1.exe,它的功能是:
(1)从一个计数文件中读取计数值,增加1后写回计数文件;
(2)根据这个计数值生成一个 .gif 或 .bmp 或 .jpg 图像;
(3)向标准输出流输出所生成图像的位置。例如Web服务器的虚拟目录为c:\inetpub\wwwroot,图像的文件名为c:\inetpub\wwwroot\counter.gif,则输出的C语言程序语句为:
printf("Content-Type: text/html");
printf("Location: /counter.gif");
这种方法使用最普遍,但自己实现时,根据计数值生成图像是比较困难的,需要了解所用图像的存储格式。即使知道了所用图像的存储格式,其编程也是相当麻烦的。
二、使用Java Applet和Client/Server结构
在Web服务器上运行一个计数服务程序,每次当客户与其建立连接时,将计数值增加1并返回给客户。传送到浏览器的HTML文件中内嵌Java Applet,Applet通过 java.net.socket类和计数服务程序相连接,收到计数值后,通过 java.awt.Lable类或java.awt.Graphics类在Applet上显示出计数值。
这种方法比第一种方法实现简单,但需要在Web服务器上运行计数服务程序,显得比较累赘。作者通过实践,把以上两种方法相结合起来,得到了下面的方法。
三、Java Applet和HTTP协议以及CGI
程序相结合Applet通过 java.net.socket类不是和计数服务程序建立连接,而是通过HT TP协议启动Web服务器上的CGI程序。作者在Windows NT Server 4.0及Internet Informati on Server 2.0上通过了这种方法。作者认为,这种方法是最简单和实用的方法,值得大家一试。其原理是:客户端通过HTTP协议向Web服务器发出请求"GET /cgi-bin/counter3.exe HT TP/1.0",Web服务器启动虚拟目录/cgi-bin下的CGI程序counter3.exe,如果counter3.exe向标准输出流输出"888888",则在客户端可得到:
HTTP/1.0 200 OK
Server: Microsoft-IIS/2.0
Date: Mon, 05 May 1997 11:13:30 GMT
Content-Type: application/octet-stream
888888
由此我们得到了实现的方法。下面包括了具体实现的HTML文件、Java Applet counter 3.class和CGI程序counter3.exe的源文件。
HTML文件:
<html>
<body>
<center>
<img src="welcome.gif"><p>
<h3>您是第 <APPLET CODE="counter3.class" WIDTH=70 EIGHT=
18>
<PARAM NAME=Server VALUE="www.lh.nom">
</APPLET> 位访问者</h3>
</center>
</body>
</html>
counter3.class源程序counter3.java:
// counter3.java: HomePage中实现计数器的Java Applet
import java.awt.*;
import java.applet.*;
import java.net.*;
import java.io.*;
public class counter3 extends Applet {
//{{DECLARE-CONTROLS
Label lbmsg;
// 输出计数值的标签
//}}
public void init() {
super.init();
//{{INIT-CONTROLS
setLayout(null);
lbmsg=new Label("", Label.CENTER);
lbmsg.setFont(new Font("Dialog",Font.BOLD,14));
add(lbmsg);
lbmsg.reshape(0,0,63,15);
//}}
setBackground(Color.lightGray);
Socket
socket;
DataInputStream ind;
PrintStream
outp;
try
{
socket = new Socket(getParameter("Server"), 80);
// 其中80是Web服务器的端口号
ind = new DataInputStream( socket.getInputStream() )
;
outp = new PrintStream( socket.getOutputStream() );
outp.println("GET /cgi-bin/counter3.exe HTTP/1.0");
String response;
while ( (response=ind.readLine()).length()>0 )
{
lbmsg.setText(response);
}
socket.close();
}
catch ( IOException ex )
{ };
}
}
counter3.exe源程序counter3.cpp:
// counter3.cpp: HomePage中实现计数器的CGI程序
// counter3.exe 放在Web服务器虚拟目录 /cgi-bin 下
// Boland C++ 4.5 工程选项为Platform:Win32,Target Model:
Console
#include <stdio.h>
int main()
{
int counter;
FILE *fp;
// 读取计数值
fp=fopen("c:\inetpub\wwwroot\counter.dat", "r");
if (fp==NULL)
counter=1;
else
{
fscanf(fp, "%d", &counter);
fclose(fp);
}
// 计数值增加1,并写回计数文件
counter++;
fp=fopen("d:\inetpub\wwwroot\counter.dat", "w");
if (fp==NULL)
{
printf("??????", counter);
return 1;
}
fprintf(fp, "%d", counter);
fclose(fp);
// 向标准输出流输出计数值
printf("%06d", counter);
return 0;
}
它的Web页面如图2。
图2 Web页面(2)
在这里作者用java.awt.Label类来显示计数值,有兴趣的读者可以用java.awt.Graphic
s类来作图,使计数值变得美观一些。