江西广告网

标题: JAVA数据流的应用 [打印本页]

作者: 与你同行    时间: 2008-12-27 17:41
标题: JAVA数据流的应用
  JAVA 数 据 流 的 应 用   ---- 常 常 逛WWW 的 人, 一 定 不 会 对 许 多 起 始 页 的 计 数 器 感 到 陌 生。 当 你 每 一 次 光 临 某 些 站 点 的 起 始 页 时, 起 始 页 的 计 数 器 就 会 亲 切 的 告 诉 你, 从 某 年 某 月 某 日 开 始 算 起, 您 是 第 几 个 光 临 这 个 起 始 页 的 人。 你 可 能 知 道 这 是 用CGI 做 的, 后 面 是 什 么 ? 不 是 十 分 清 楚 吧 ! 我 们 这 里 来 分 析 一 下 计 数 器 吧; 如 是 我 写 下 本 文。 当 你 看 完 本 文 之 后 人 你 会 觉 得 计 数 器 是 这 样 的 简 单、 以 后 上Internet 网 时 不 会 觉 得 漂 亮 的 是 多 么 的 复 杂, 而 是 一 个CGI 和 数 据 流 的 杰 作。 看 看 吧 是 多 么 的 平 常 !      import java.net.*;   import java.io.*;   import java.awt.*;      ---- 在 这 里 小 程 序 引 入 了 三 类 库。 都 是 标 准 类 库, 为 了 使 用 数 据 流 而 引 入 了java.io.* 类 库; 为 了 使 用URL 引 入 了java.net.* 类 库; 同 时 为 了 在 字 形 与 图 形 引 入 了java.awt.* 类 库。      public class JavaCounter extends java.applet.Applet   这里扩展了Applet,这里的JavaCounter是继承了Applet的属性。      {   Font fn=new Font("TimesRoman",Font.BOLD,24);   设置了显示的字形和使用的确24点字模。   String counter_str,myurl;   String filename;   取得资源Counter。   public void init()      ---- 关 键 字public 告 诉java 编 译 器 其 它 对 象 从 类Applet 的 外 部 调 用init 函 数 关 键 字void 告 诉java 编 译 器init 不 向prowser 返 回 任 何 值。       {    filename=getParameter("filename");    if(filename==null) filename="home.txt";    myurl="http://202.115.144.32/cgi-bin/counter.exe?home.txt";    try{    URL serverURL=new URL(myurl);    DataInputStream dis;    dis=new DataInputStream(serverURL.openStream());    counter_str=dis.readLine();    counter_str=dis.readLine();    dis.close();    }    catch(MalformedURLException mfURLe) {}    catch(IOException ioe) {}    }      ---- 这 里 我 们 从 网 络 的 远 程 取 得 数 据 文 件 的 过 程。 注: 虽 然 有 此URL 位 置 看 起 来 长, 但 在JAVA 中 基 本 上 是 一 资 源 的 传 输 协 议, 加 上 一 个 资 源 的 名 称。 如 上 面 中 的HTTP 一 样 都 是 典 型 的 传 输 协 议。 通 常 具 有 一 个 或 多 个 结 构。 为 了 处 理 方 便, 在JAVA 中 特 别 为URL 位 置 设 计 了URL 类, 可 以 用 一 个URL 对 象 记 录 下 完 整 的URL 信 息, 这 里 我 们 使 用 的 就 是URL。 同 时 我 们 用 了java.io.*; 中 的 数 据 流 的 程 序 包。 数 据 流 可 以 看 作 是 数 据 的 通 信 途 径。 通 常 是 建 立 一 条 数 据 通 道 后 在 程 序 读 取 时 向 这 个 通 道 发 送 信 号、 远 方 数 据 自 动 送 来 的 过 程 我 们 叫 做" 数 据 流"。 而 本 程 序 主 要 部 分 也 是 这 些。      public void paint(Graphics g)    {    g.setFont(fn);    g.setColor(Color.blue);    g.drawString("庆祝吧!    第"counter_str"位朋友您的到来!",10,50);    }      ---- 当 我 们 从 数 据 流 收 到 信 息 后, 就 由Applet 中 的 方 法paint 去 处 理, 并 把 设 好 的 字 形 显 示 于 屏 幕 上。      }      ---- 注: 编 好 这 个 程 序 之 后 还 要 一 个CGI 程 序 才 能 发 挥 作 用。 还 是 说 一 下CGI 的 其 本 思 路 吧 ! 我 们 先 打 开"counter.exe?home.txt" 的 记 录 读 出 记 录 加1 并 更 新 数 据 关 闭 记 录。 并 输 出 记 录 通 过 数 据 流 给JAVA 程 序 读 取 的 方 式。 下 面CGI 例 子 是 用C 编 的 你 不 妨 试 试 吧 ! ! 同 时 为 了 读 和 应 用 的 方 便 写 下 了CGI 与JAVA 的 全 部 原 程 序。      ---- Java 原 程 序 如 下:      import java.net.*;   import java.io.*;   import java.awt.*;   public class JavaCounter extends java.applet.Applet   {   Font fn=new Font("TimesRoman",Font.BOLD,24);   String counter_str,myurl;   String filename;   public void init()    {    filename=getParameter("filename");    if(filename==null) filename="home.txt";    myurl="http://202.115.144.32/    cgi-bin/counter.exe?home.txt";    try{    URL serverURL=new URL(myurl);    DataInputStream dis;    dis=new DataInputStream(serverURL.openStream());    counter_str=dis.readLine();    counter_str=dis.readLine();    dis.close();    }    catch(MalformedURLException mfURLe)    {}    catch(IOException ioe)    {}    }      public void paint(Graphics g)    {    g.setFont(fn);    g.setColor(Color.blue);    g.drawString(counter_str,10,50);    }      }      ---- CGI 程 序 代 码 如 下:      #include   #include      int SplitArgs (char *str, char *argv[]);   int PASCAL WinMain (HINSTANCE hInstance,   HINSTANCE hPrevInstance,    LPSTR lpszCmdLine, int nShow)   {    int argc;    char *argv[32]; // Max 32 command line arg    long num;    FILE *fp;    argc = SplitArgs(lpszCmdLine, argv);    // Split command line args   puts("Content-type: text/plain\n");    // NOTE: blank line here    if(argc< =1)    {printf("!!!Too less Parameter!!!");    printf("\n用法为在counter.exe?    后加上数据文件名");    return(1);    }    fp=fopen(argv[1],"r");    fscanf(fp,"%ld",&num);    num ;    printf("\n%ld",num);    fclose(fp);    fp=fopen(argv[1],"w");    fprintf(fp,"%ld",num);    fclose(fp);    return(0);   }      int SplitArgs (char *str, char *argv[])   {    int argc;    char *cp;    static char safe_copy[256];    // Single threaded, this is OK    char appname[256];       GetModuleFileName(NULL, appname, 256);    // Get app filename       memset(safe_copy, 0, sizeof(safe_copy));    // Must clear old stuff...    strcpy(safe_copy, appname); // VC 2.0    strcat(safe_copy, " ");    strcat(safe_copy, str);       argc = 0;    cp = safe_copy;    while (*cp) // Stop at null character    {    while(*cp && isspace (*cp))    // Scan past white or to end    cp = 1;    if(*cp) // On next token or at end    argv[argc ] = cp; // Next token: ptr and bump    while(*cp && !isspace (*cp)) // Scan to white or end    cp = 1;    *cp = '\0'; // Terminate this token    }    return (argc);   }      ---- 注: 一 定 要 另 加 一 个 文 本 文 件 名 要 与JAVA 中 文 本 文 件 同 名, 还 需 要 在 文 本 文 件 中 写 一 个 字 符"1" 就 好 了。 与 您 的CGI 程 序 放 在 同 一 目 录 中。   




欢迎光临 江西广告网 (http://bbs.jxadw.com/) Powered by Discuz! X3.2