GONE WITH THE WIND

--tomorrow is another day

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  30 随笔 :: 19 文章 :: 0 评论 :: 0 Trackbacks

2009年3月27日 #

LI代码的格式化:
A).运用CSS格式化列表符: ul li{
list-style-type:none;
}
B).假如你想将列表符换成图像,则: ul li{
list-style-type:none;
list-style-image: url(/blog/images/icon.gif);
}
C).为了左对齐,可以用如下代码: ul{
list-style-type:none;
margin:0px;
}
D).假如想给列表加背景色,可以用如下代码: ul{
list-style-type: none;
margin:0px;
}
ul li{
background:#CCC;
}
E).假如想给列表加MOUSEOVER背景变色效果,可以用如下代码: ul{ list-style-type: none; margin:0px; }
ul li a{ display:block; width: 100%; background:#ccc; }
ul li a:hover{ background:#999; }说明:display:block;这一行必须要加的,这样才能块状显示!

F).LI中的元素水平排列,要害FLOAT:LEFT: ul{
list-style-type:none;
width:100%;
}
ul li{
width:80px;
float:left;
}
<ul><li>的区别
<LI> 的参数设定(常用):
 


例如: <li type="square" value="4">

type="square"
只适用于非顺序清单,设定符号款式,其值有三种,如下,内定为 type="disc":
符号 是当 type="disc" 时的列项符号。
符号 if" width=10 height=10 border=0> 是当 type="circle" 时的列项符号。
符号 是当 type="square" 时的列项符号。
value="4"
只适用于顺序清单,设定该一项的数目,其後各项将以此作为起始数目而递增,但前面各项则不受影响,其值只能是 1,2,3.. 等整数,没有内定值。
<UL>称为无序清单标记。
所谓无序清单就是在每一项前面加上 、、等符号,故又称符号清单。
<UL> 的参数设定(常用):
例如: <UL type="square">

type="square"
设定符号款式,其值有三种,如下,内定为 type="disc":
符号 是当 type="disc" 时的列项符号。
符号 是当 type="circle" 时的列项符号。
符号 是当 type="square" 时的列项符号。

<ul>是项目列表,<li>是列表项,项目列表就是用符号来列的,所以你列出来默认的就是黑点啦,还有一个是<ol>这个是编号列表,用数字来列的,也是用<li>做列表项

 


<li>是 list item 即列表项,但列表有很两种,所以外面得有 <ul> 或者 <ol> 用来区别无序列表(小点点)和有序列表(1,2,3...)。

posted @ 2009-04-13 09:22 张永耀 阅读(389) | 评论 (0)编辑 收藏

(from:http://www.0574dh.com/article.asp?id=420)

/* mozilla.org Base Styles
* maintained by fantasai
* (classes defined in the Markup Guide - http://mozilla.org/contribute/writing/markup)
*/
/* Suggested order:
//显示属性
* display
* list-style
* position
* float
* clear
//自身属性
* width
* height
* margin
* padding
* border
* background
//文本属性
* color
* font
* text-decoration
* text-align
* vertical-align
* white-space
* other text
* content
*
*/
posted @ 2009-04-08 12:31 张永耀 阅读(175) | 评论 (0)编辑 收藏

(from: http://www.webwoo.net/bc/bencandy-38-20144-1.htm)
优化代码:网页技术CSS的font属性的缩写的技巧,缩写有利于减少代码,优化CSS,使之更加合理。

  css font属性是用来控制文字字体、颜色、大小等。而font的属性有多种,在通常情况下,我们用缩写的办法将多种属性概括在一句css代码中。这样极大的减小了代码,优化css文件。

  我们常用的font属性有下面这六种:

font-style设定斜体 如:font-style: italic;
font-weight设定文字粗细 如:font-weight: bold;
font-size设定文字大小 如:font-size: 12px;
line-height设定行距 如:line-height: 150%;
color设定文字颜色(注意不是font-color) 如:color: red;
font-family设定字体 如:font-family : "Lucida Grande", Verdana, Lucida, Arial, Helvetica, 宋体,sans-serif;

  上述的属性,我们可以概括写在一行font属性里。需要注意的是color属性我们需要单独定义。

font: italic bold 12px/150% "Lucida Grande", Verdana, Lucida, Arial, Helvetica, 宋体,sans-serif;}

  上面的例子用一行来定义font属性,分别是:font-style font-weight font-size line-height font-family;而color设定文字颜色需要单独进行定义。

posted @ 2009-04-08 12:30 张永耀 阅读(185) | 评论 (0)编辑 收藏

使用PHP编程的人都会碰到这样一个问题:当PHP代码和HTML代码在一起的时候,看PHP代码很费劲,整个文件也无法用Dreamweaver来编辑,这对于PHP程序员和美工来讲,修改这样的文件就象一个噩梦。
PHP中的模板(Template)技术就是为了解决这个问题而出现的。PHP模板类有很多,比较常见的是 FastTemplate 和 PHPLib, 因为出现得早,在PHP编程界名声很大。PHP程序员不知道这两个类,就象VB程序员不知道MsgBox函数一样,是一件不可思议的事情。
以前我们需要去下载PHP模板类,现在PHP4有了自己的模板类 IntegratedTemplate 和 IntegratedTemplateExtension,功能和PHPLib 差不多。这两个类是子类和父类的关系。一般我们用 IntegratedTemplateExtension 就可以了。让人感到不可思议的是 IntegratedTemplate 不是从 PEAR 类继承过来,无法用到 PEAR 类的 debug 功能。
以下举例子说明它们的用法,假设 IntegratedTemplate 类和 IntegratedTemplateExtension 类分别在 C:\php4\pear\HTML\ITX.php 和 C:\php4\pear\HTML\ITX.php 中。我们写的代码放在C:\TestPHP\PHP4\Welcome.htm 和 C:\TestPHP\HTML\Welcome.php 中。将C:\TestPHP\PHP4 在Web Server 上设成虚拟目录 /testphp 并且给与脚本执行权限,确认C:\TestPHP\HTML\Welcome.htm 无法通过远端浏览器访问。在 php.ini 里面设置 include_path = ".;C:\php4\pear"
例1:
我们在HTML文件中放置变量的标记,用PHP代码设置变量的值,然后将HTML中的标记替换掉,最后输出到客户浏览器。
以下是 Welcome.htm 代码,我们放了三个PHP tag(变量标记)为: {WelcomeTitle}、{UserName}、{WelcomeMessage}



您好,{UserName}


{WelcomeMessage}



以下是Welcome.php代码
<?php
require_once "HTML/ITX.php";

//以下是给变量赋值,在实际代码中可能从Database中取得数据然后赋值
$WelcomeTitle = "欢迎来到网页天堂";
$UserName = "皮皮鲁";
$WelcomeMessage = "您的到来让我们深感荣幸!";

//一般来说这种全局变量放在单独的一个文件中,便于维护
$HTML_CODE_FILE_ROOT = "../HTML/";

$tpl = new IntegratedTemplateExtension($HTML_CODE_FILE_ROOT);

指定要替换 tag 的 HTML 文件
$tpl->loadTemplatefile("Welcome.htm");

替换HTML 文件中的 tag
$tpl->setVariable( array (
"WelcomeTitle" => $WelcomeTitle,
"UserName" =>$UserName,
"WelcomeMessage" =>$WelcomeMessage
) );

输出替换后的 HTML
$tpl->show();
?>

这样写好后,Welcome.htm 仍然可以使用网页编辑器如Dreamweaver、FrontPage 进行编辑,Welcome.php中是纯粹的PHP代码,不含HTML,方便以后的代码修改和维护。
如果将 IntegratedTemplateExtension 类和 PHP4中的 Cache 类 联合使用,在速度上可以得到很好的效果。
PHP4 模板类还可以使用 Block,配合其他 PHP4 中的类 可以很轻松地实现数据库数据检索的翻页,可以很轻松写出论坛之类的软件。

补充说明:为了防止用户直接用 Welcome.htm 看网页,将 Welcome.htm 放在客户访问不到的目录(只要不在Web Server 的虚拟目录下即可)。对于大型的PHP项目,图片、PHP代码、HTML文件、多语言字符串文件都应该放在不同的目录,这样在多人共同做一个项目时不至于混乱。
posted @ 2009-04-08 12:29 张永耀 阅读(358) | 评论 (0)编辑 收藏

分离内容和表现
HTML从来就不是表现的手段,但从用户端结合元素来格式化文本,开发者从中找到操作布局的方法。CSS的强大,使得现在不再需要用HTML做任何表现了,而内容也可以完全从表现(CSS)中分离出来。

这样做有很多好处──通常可以压缩文件容量,有着用一个主要样式表就可控制整个网站而不是单个页面的灵活性,也可能使页面更易用,更具亲和力。

遵循这些基本原则基本上意味着你不应该在HTML内使用样式化的任何事物了。比如font的标签,比如bgcolor的属性不应该再使用。甚至在图像标签img内的边框属性border在XHTML 1.1中也是非法的了。别担心,过时的HTML可以样式化,CSS更可以样式化,而且可以做得更好。

不仅仅是从HTML内剥离表现,内容的结构意味着在适合的地方使用明确的HTML标签。比如,h1,h2等应用在标题上──而不仅仅是使用CSS使字体变大而已。

最佳指引就是一个可视化的浏览器上使用其默认的样式来呈现一个没有样式表(或者有样式表,但不支援样式表的文本浏览器,比如lynx——译者注)的页面。

表格不应该用在布局上──表格用来表示表格式的数据(我们已经不厌其烦地说了很多次──译者注)。也许对于已经习惯传统结构的HTMLer来说,完全改变有很大的技术难度。这个方法很大程度上压缩了文件,而且,基于这些显性代码,它变得更易用,更具亲和力。

关于更多,请阅读CSS高级指南的布局。


在XHTML中所有的标签都必须小写和关闭。没有闭合标签的(如br和img)必须用英文半角正斜杠“/”在后面自关闭(如<br />)。注意在斜杠前应该有一个英文半角空格。

标记也必须是合式的,使元素正确嵌套(比如<strong><em>this</em></strong>,而不是<strong><em>this</strong></em>)。

所有的文档都要有html,head,title和body元素。也必须从文档类型声明开始。

文档主体应该从 p, h1,h2, h3,h4,h5,h6,div, pre,address,ins或者del开始。

属性
所有的属性必须是小写的,它们的值也要用英文半角引号括(")起来。

精简属性是不允许的(比如<input type="checkbox" checked />)。按惯例,精简属性必须给出跟属性名称一样的值(如 <input type="checkbox" checked="checked" />)。

名字 name属性不再是合法的了(除了在表单元素中),应该使用id来代替。

目标属性target不是一个合法的属性。庆幸吧,它有些癫狂。

在img里,alt属性是必须的。

亲和力
为残障人士制做具有亲和力网页的理由是不证而明的。不仅是人道的,而且也对老年用户和五官功能减退的用户有利(想一想,有一天我们老了,视力消退,五官不灵,怎么浏览互联网?为年老积点德,现在就考虑亲和力吧!——译者注)。亲和力不仅与有严重残障人士方便,也使大部分少量消退功能(特别是视觉)的用户更为易用。

这个问题越来越牵涉法律问题了,比如美国的“508条款”的采用,试图积极推动强制使用亲和力;在英国,所有的政府网站必须有一个指定的亲和力程度。什么时候才可以有像在建筑物上的亲和措施的立法,以便普遍用在商业网站上?(中国还不知道什么时候有这种立法呢!但不等于我们就不要关注我们设计的网页的合法性。——译者注)

如果能遵循上述的建议,你的HTML应该已经具备了为残障用户服务的高度亲和力。还有更多的创作使你的亲和力更上一层楼,而且不难。见亲和连接和亲和表单指南。

posted @ 2009-04-08 12:28 张永耀 阅读(352) | 评论 (0)编辑 收藏

怎么改善现有网站

我们大部分的设计师依旧在采用传统的表格布局、表现与结构混杂在一起的方式来建立网站。学习使用XHTML CSS的方法需要一个过程,使现有网站符合网站标准也不可能一步到位。最好的方法是循序渐进,分阶段来逐步达到完全符合网站标准的目标。如果你是新手,或者对代码不是很熟悉,也可以采用遵循标准的编辑工具,例如Dreamweaver MX 2004,它是目前支持CSS标准最完善的工具。

1.初级改善

  • 为页面添加正确的DOCTYPE

很多设计师和开发者都不知道什么是DOCTYPE,DOCTYPE有什么用。DOCTYPE是document type的简写。主要用来说明你用的XHTML或者HTML是什么版本。浏览器根据你DOCTYPE定义的DTD(文档类型定义)来解释页面代码。所以,如果你不注意设置了错误的DOCTYPE,结果会让你大吃一惊。XHTML1.0提供了三种DOCTYPE可选择:

(1)过渡型(Transitional )

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

(2)严格型(Strict )

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

(3)框架型(Frameset )

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">

对于我们初级改善来说,只要选用过渡型的声明就可以了。它依然可以兼容你的表格布局、表现标识等,不至于让你觉得变化太大,难以掌握。

Tip:你懒得输入上面过渡型代码的话,可以访问http://www.macromedia.com/网站的首页,然后查看源代码,把head区同样的代码拷贝粘贴就可以了。

  • 设定一个名字空间(Namespace)

直接在DOCTYPE声明后面添加如下代码:

<html XMLns="http://www.w3.org/1999/xhtml" >

一个namespace是收集元素类型和属性名字的一个详细的DTD,namespace声明允许你通过一个在线地址指向来识别你的namespace。只要照样输入代码就可以。

  • 声明你的编码语言

为了被浏览器正确解释和通过标识校验,所有的XHTML文档都必须声明它们所使用的编码语言。代码如下:

<meta http-equiv="Content-Type" content="text/html; charset=GB2312" />

这里声明的编码语言是简体中文GB2312,你如果需要制作繁体内容,可以定义为BIG5。

  • 用小写字母书写所有的标签

XML对大小写是敏感的,所以,XHTML也是大小写有区别的。所有的XHTML元素和属性的名字都必须使用小写。否则你的文档将被W3C校验认为是无效的。例如下面的代码是不正确的:

<TITLE>公司简介</TITLE>

正确的写法是:

<title>公司简介</title>

同样的,<P>改成<p>,<B>改成<b>等等。这步转换很简单。
  • 为图片添加 alt 属性

为所有图片添加alt属性。alt属性指定了当图片不能显示的时候就显示供替换文本,这样做对正常用户可有可无,但对纯文本浏览器和使用屏幕阅读机的用户来说是至关重要的。只有添加了alt属性,代码才会被W3C正确性校验通过。注意的是我们要添加有意义的alt属性,象下面这样的写法毫无意义:

<img src="logo_unc_120x30.gif" alt="logo_unc_120x30.gif">

正确的写法:

<img src="logo_unc_120x30.gif" alt="UNC公司标志,点击返回首页">

  • 给所有属性值加引号

在HTML中,你可以不需要给属性值加引号,但是在XHTML中,它们必须被加引号。

例:height="100",而不能是height=100。

  • 关闭所有的标签

在XHTML中,每一个打开的标签都必须关闭。就象这样:

<p>每一个打开的标签都必须关闭。</p>

<b>HTML可以接受不关闭的标,XHTML就不可以。</b>

这个规则可以避免HTML的混乱和麻烦。举例来说:如果你不关闭图像标签,在一些浏览器中就可能出现CSS显示问题。用这种方法能确保页面和你设计的一样显示。需要说明的是:空标签也要关闭,在标签尾部使用一个正斜杠"/"来关闭它们自己。例如:

<br />

<img src="webstandards.gif" />

经过上述七个规则处理后,页面就基本符合XHTML1.0的要求。但我们还需要校验一下是否真的符合标准了。我们可以利用W3C提供免费校验服务(http://validator.w3.org/)。发现错误后逐个修改。在后面的资源列表中我们也提供了其他校验服务和对校验进行指导的网址,可以作为W3C校验的补充。当最后通过了XHTML验证,恭喜你已经向网站标准迈出了一大步。不是想象中的那么难吧!

2.中级改善

接下来我们的改善主要在结构和表现相分离上,这一步不象第一步那么容易实现,我们需要观念上的转变,以及对CSS2技术的学习和运用。但学习任何新知识都需要花点时间的,不是吗?诀窍在于边做边学。假如你一直采用表格布局,根本没用过 CSS,也不必急于跟表格布局说再见,你可以先用样式表代替 font 标签。随着你学到的越多,你能做的就越多。好,一起来看看我们需要做哪些事:

  • 用CSS定义元素外观

我们在写标识时已经养成习惯,当希望字体大点就用<h1>,希望在前面加个点符号就用<li>。我们总是想<h1>的意思是大的,<li>的意思是圆点,<b>的意思是“加粗文本”。而实际上, <h1>能变成你想要的任何样子,通过CSS,<h1>能变成小的字体,<p>文本能够变成巨大的、粗体的,<li>能够变成一张图片等等。我们不能强迫用结构元素实现表现效果,我们应该使用CSS来确定那些元素的外观。例如,我们可以使原来默认的6级标题可以看起来大小一样:

h1, h2, h3, h4, h5, h6{ font-family: 宋体, serif; font-size: 12px; }

  • 用结构化元素代替无意义的垃圾

许多人可能从来都不知道HTML和XHTML元素设计本意是用来表达结构的。我们很多人已经习惯用元素来控制表现,而不是结构。例如,一段列表内容可能会使用下面这样的标识:

句子一<br /> 句子二<br /> 句子三<br />

如果我们采用一个无序列表代替会更好:

<ul> <li>句子一</li> <li>句子二</li> <li>句子三</li> </ul>

你或许会说“但是<li>显示的是一个圆点,我不想用圆点”。事实上,CSS没有设定元素看起来是什么样子,你完全可以用CSS关掉圆点。

  • 给每个表格和表单加上id

给表格或表单赋予一个唯一的、结构的标记,例如

<table id="menu">

接下来,在书写样式表的时候,你就可以创建一个“menu”的选择器,并且关联一个CSS规则,用来告诉表格单元、文本标签和所有其他元素怎么去显示。这样,不需要对每个<td>标签附带一些多余的、占用带宽的表现层的高、宽、对齐和背景颜色等等属性。只需要一个附着的标记(标记“menu”的id标记),你就可以在一个分离的样式表内为干净的、紧凑的代码标记进行特别的表现层处理。

中级改善我们这里先列主要的三点,但其中包含的内容和知识点非常多,需要我们逐步学习和掌握,直到最后实现完全采用CSS而不才用任何表格实现布局。

posted @ 2009-04-08 12:21 张永耀 阅读(127) | 评论 (0)编辑 收藏

CREATE USER 'dream2008'@'%' IDENTIFIED BY 'dream1234';
GRANT ALL PRIVILEGES ON *.* TO 'dream2008'@'localhost' IDENTIFIED BY 'dream1234'WITH GRANT OPTION


MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0;

MYSQL数据库实用学习资料之常用命令集合
2007-10-12 源自:赛迪网 网友评论 0 条 进入视频教程
Mysql数据库是一个多用户,多线程的关系型数据库,是一个客户机/服务器结构的应用程序。它是对个人用户和商业用户是免费的.


Mysql数据库具有以下优点:


1.同时访问数据库的用户的数量不受限制

2.可以保存超过5千万条的记录

3.是目前市场上现有数据库产品中运行速度最快的数据库系统

4.用户权限设置简单、有效。


Mysql数据库常用命令:


启动Mysql数据库


C:/>cd Mysql5.0/bin

C:/Mysql5.0/bin>mysqld –install 安装Mysql服务

C:/Mysql5.0/bin>net start mysql 启动Mysql服务

请求的服务已经启动。


连接mysql

用户需要提供Mysql的用户名和密码来连接服务器,如果服务器不是在本机,则还需要一个主机名或IP来指定服务器的位置。

C:/Mysql5.0/bin>mysql -h localhost -u root -p

Enter password: ****

Welcome to the MySQL monitor. Commands end with ; or /g.

Your MySQL connection id is 6 to server version: 5.0.18-nt


Type 'help;' or '/h' for help. Type '/c' to clear the buffer.


mysql>

使用一条简单的查询语句


mysql> select version(),current_date;

mysql> select version();select now();


新建或删除一个数据库


Mysql>create database mydb;

Mysql> drop database mydb;


打开的数据库的命令


mysql> use mysql

Database changed


查看数据库的命令


mysql> show databases;


查看数据表的详细结构


mysql> desc func;


新建数据库


mysql> create database school;

Query OK, 1 row affected (0.00 sec)


新建表


mysql> create table user01(

-> id varchar(20) NOT NULL,

-> userName varchar(10) NOT NULL,

-> age int(11) default'0',

-> sex char(2) NOT NULL default'm',

-> PRIMARY KEY (id)

-> )TYPE=InnoDB;

Query OK, 0 rows affected, 1 warning (0.02 sec)mysql>desc student;


插入和删除表中的数据


Create table student(stuName varchar(20),age varchar(20),id varchar(20),set0 char(1));


插入


mysql> insert into student(id,stuName) values('1','tomcat');

Query OK, 1 row affected (0.00 sec)


删除


mysql> delete from student where id='1';

Query OK, 1 row affected (0.01 sec)


删除表中所有数据


mysql> truncate table student;

Query OK, 1 row affected (0.01 sec)


删除表


mysql> create table temp(t varchar(1));

Query OK, 0 rows affected (0.00 sec)


mysql> drop table temp;

Query OK, 0 rows affected (0.00 sec)


创建新用户并给予权限


mysql> grant all privileges on *.* to dbuser@localhost identified by '1234'

with grant option;


更改Mysql用户密码


c:/Mysql5.0/bin>mysqladmin -u root -p password 1234

Enter password: ****


备份数据库及表


我们用mysqldump命令来备份数据库

c:/mysql/bin/>mysqldump –u root –p 3306 mysql>d:/backup.sql

执行此语句将把mydb 备份到D盘的backup.sql文件中


备份多个数据库表


c:/mysql/bin/>mysqldump –u root –p 3306 school user01 user >d:/backup.sql

此句的意思是把school库中的user01表和user表的内容和表的定义备份到D盘backup.sql文件中。


备份所有的数据库


c:/myql/bin>mysqldump –u root –p 3306 –all –database>d:backup.sql


还原Mysql数据库

c:/mysql/bin/mysql –u root –p 3306 school

还原其中的一个表


mysql> source d:/books.sql;

ERROR:

Unknown command '/b'.

Query OK, 0 rows affected (0.00 sec)

Query OK, 1 row affected (0.00 sec)


退出Mysql连接


mysql>quit(exit)


关闭mysql服务


C:/mysql/bin>net mysql

(责任编辑:卢兆林)


mysql4.0.26 win32 下载及安装方法
[color=blue]mysql4.0.26安装方法:[/color]
  
     解压下载后的mysql-4.0.26-win32.rar,执行setup.exe,默认安装,一路NEXT就可以了.
    
     安装完毕后,在“开始”菜单的“运行”中输入:C:\MySQL\bin\mysqld-nt.exe -install ([color=Red]这个版本建议安装在C盘[/color]),运行成功之后再在“开始”菜单的“运行”输入:net mysql start ,将会启动 MySQL 服务.
    
     默认管理员root 密码空 请使用PHPMYADMIN 修改.

[color=red]注: 这个版本建议安装在C盘,如果安装后不能启动,重启服务器后,请直接到系统服务里面去启动MYSQL.

[/color][color=Blue]怎么删除mysql服务?[/color]
开始-运行-CMD-进入MYsql的安装目录下的bin目录输入下面命令
D:\mysql5\bin>mysqld-nt.exe -remove

 


 

posted @ 2009-04-02 15:10 张永耀 阅读(620) | 评论 (0)编辑 收藏

PHPCMS2008模板教程 默认模板解析及模板制作教程 PHPCMS2008官方默认 模板解读 首先打开后台,官方默认模板的存放位置,存放在 ./templates/default/ php cms/ 目录里,从这里我们就知道如果我们要新那建一套模板应该怎么做了: 方法:把全套模板放在一个文
  

PHPCMS2008模板教程 默认模板解析及模板制作教程
首先打开后台,官方默认模板的存放位置,存放在 ./templates/default/phpcms/ 目录里,从这里我们就知道如果我们要新那建一套模板应该怎么做了:
方法:把全套模板放在一个文件夹内,如:W3ZZ,然后上传至templates下面,进入后台,我们在方案管理处就可以看到我们刚刚上传的W3ZZ了,把该方案设置成默认方案,更新模板缓存,然后更新首页就完全是我们W3ZZ里面的模板了,就这样简单……
如图:
 这里就是我们W3ZZ文件夹下面PHPCMS里的所有模板,也就是整站核心的模板,包括首页,栏目首页,列表页,内容页,标签模板……
接下来看一下header.html、index.html、footer.html 三个模板文件。这是首页模板的灵魂!不仅是首页,其它页面的头部文件和页脚文件也是header.html,footer.html这个不用我说了,因为看看模板中的{template 'phpcms','header'}{template 'phpcms','footer'}说一下这三个参数的含义:
第一个template,是整个系统的模板文件夹,也就是前面讲的为什么要传到templates下面的原因,因为系统定义的模板文件夹就为templates,也就是这里的template;第二个phpcms,就是目前你的模板所在phpcms文件夹名称,如果你要新建一个头部,只要在phpcms里面新建一个文件,如:header_w3zz.html,然后用{template 'phpcms','header_w3zz'}就可以了,这样第三个header这个就明白了,是要包含的模板文件的名称,footer这个就一样了。
完整页面模板是header+index+footer,有了这三部分,首页模板就可以说结构完整了。
对应2008的默认模板看:(因为都有默认的,所以就不贴出来了,占地方,也不方便看)
现在我们开始分析header.html的构造
1、<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "
http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">    w3c国际标准


2、<meta http-equiv="Content-Type" c />     

这里定义字符编码,也就是我们下载的时候是GBK还是UTF-8的,这个{CHARSET}就是编码变量,这个你在安装的时候就已经确定,所以以后的任何操作都要在该编码下操作,否则就会出现乱码,也就是说,出现乱码这些的原因就在于此。

3、<title>{$head[title]}</title>               
这个就是网站名称-网站标题,在后台系统设置--基本设置--网站名称-网站标题,在首页会两个都显示出来,其它的页面就只显示网站名称

4、<meta c name="keywords" />     
在后台系统设置--基本设置--网页关键词

5、<meta c name="description" />   
在后台系统设置--基本设置--网页描述

6、<base href="{SITE_URL}" _fcksavedurl=""{SITE_URL}"" />              
这是全部定义的,就相当于2007里面的{PHPCMS_PATH},同时2008也用。但是在这里定义之后你的模板里面的调用任何文件都不用定义{PHPCMS_PATH}了,如:我要调用images下面的一个图片,你只要写<img src="images/w3zz.jpg">这样就好。{SITE_URL}这个就是你网站的在后台系统设置--基本设置--网站地址

7、<link href="favicon.ico" rel="shortcut icon" />   
这个效果就是:  就是网站地址前面的标识,也就调用images/favicon.ico文件,这个可以制作,有制作工具

8、<link href="{SKIN_PATH}{$mod}.css" rel="stylesheet" type="text/css" />   
引用全部CSS文件,即templates/default/skins/default下面的CSS文件{SKIN_PATH}就是templates/default/skins/default这个地址,{$mod}是当前模型的变量,如:当前是phpcms那就说明CSS文件是phpcms.css

9、<link rel="alternate" type="application/rss+xml" title="{$head[title]}" href="/rss.php?rssid={$catid}" />  
网站标题,即订阅的地址

10<script language="JavaScript" src="data/config.js"></script>  _fcksavedurl=""data/config.js"></script> "        
配置js文件      

<script language="JavaScript" src="images/js/jquery.min.js"></script>  
框架js文件

<script language="JavaScript" src="images/js/css.js"></script>              
cssjs文件

<script language="JavaScript" src="images/js/common.js"></script>      
配置js包括添加收藏夹,设置为首页
<script language="JavaScript" src="images/js/login.js"></script>            
登陆js文件

<script language="JavaScript" src="images/js/validator.js"></script>         
cookie等的js文件

出现相对应的问题,首先检查这里的js是否调用
 

11、<body   
页面载入的时候调用输出catid或者mod,所以说$catid和$mod即栏目ID和模型名称是全局变量

12、<div id="top">
{if isset($MODULE['search'])}
{php $types = cache_read('search_type.php');}
  <div class="f_r">
     <form name="site_search" action="{$MODULE[search][url]}" target="_blank">
   <input type="hidden" name="type" value="all"/>
      <input type="text" name="q" size="20"/>
      <select>
        <option value="all">全部</option>
  {loop $types $k $name}
        <option value="{$k}">{$name}</option>
  {/loop}
      </select>
      <input type="submit" name="s" id="button" value="搜索" />
  </form>
  </div>
{/if}
  <div class="f_l">
    <div id="div_login" style="display:block">
  <form action="{$MODULE[member][url]}login.php" method="post" name="login" >
  用户名:<input type="text" name="username" size="12"/>
  密码:<input type="password" name="password" size="12"/>
     <input type="submit" name="dosubmit" value="登录" />
     <input type="button" name="register" value="注册" />
     <input type="hidden" name="cookietime" value="0"/>
  </form>
</div>
    <div id="div_logined" style="display:none">
  <strong id="logined_username" ></strong>,<a href="{$MODULE[member][url]}">会员中心</a> |
        <a href="{if $PHPCMS['uc']}{$MODULE[member][url]}logout.php{else}javascript:logout('{$MODULE[member][url]}logout.php?action=ajax');{/if}">退出登录</a>
</div>
  </div>
</div>   

这就是网站首页顶站的搜索框和登陆框,以及登陆后的效果。
如图: 
13、<div id="head">
  <div id="logo">
    <a href="{SITE_URL}"><img src="images/logo.gif" _fcksavedurl=""images/logo.gif"" alt="{$PHPCMS[sitename]}" /></a>
    <a href="{SITE_URL}rss.php" target="_blank"><img src="images/rss.jpg" alt="rss信息聚合" /></a></div>
<div class="ad" id="topbanner"><script language="javascript" src="data/js.php?id=1"></script></div>
</div>
<div id="menu">
<ul>
   <li><a href="" id="menu_phpcms"><span>首页</span></a></li>
   {tag_一级栏目}
</ul>
</div>     
头部里面的head  包括logo,订阅标志,banner,导航
效果如图: 

主体页面index.html代码解析
1、第一个div  <div id="main"></div>   这个主要控制页面的宽度,框加显示,具体样式对应看CSS文件里面的#main这样就明白了,所以说看了模板就知道CSS样式是如何的了,这里就告诉需要修改样式的朋友,要修改哪里,先看那里的模板,然后对应<div>的class或者id去相应的CSS里面查找,然后按着你的想法修改
同时我们也可以这样实现。如:我要把整个页面改成960px的宽度,<div id="main" style="width:960px;"></div>这样改是最保险的,既不会影响全局的CSS,也不会影响其它页面的,我只是举个例子,其它的当然也可以这样改,这样操作最方便。
2、第二个div <div id="main_l"></div>   这个一看就知道是main里面的left了,这就id是main_l,如果要修改可参考1的说明。这个div里面包含了幻灯片,搜索框,栏目首页列表。下面我们具体分析:
第一块:幻灯片 首页头条首页推荐
<div class="cribox_bdr">
      <!--幻灯片-->
      <div id="slide">{tag_首页幻灯片}</div>
      <!--热点文章-->
      <div id="hotnews" class="f_r"> {tag_网站首页头条}
        <ul class="text_list">
          {tag_网站首页推荐}
        </ul>
      </div>
    </div>这个里面有注释一看就懂了,里面也就是三个标签,{tag_首页幻灯片}  {tag_网站首页头条}  {tag_网站首页推荐}这个在PHPCMS2008里面分别通过三个推荐位置来实现的,幻灯片是首页焦点,首页头条就是首页头条,首页推荐就是首页推荐,这个一看标签设置就可以明白了,同样你也可以修改这些设置。标签设置的教程我以后补上。
第二块:搜索框
<!--{if isset($MODULE['search'])}-->      这里判断是否安装最搜索模块,安装了就显示,否则不显示
<script type="text/javascript">
function set_type(type)
{
$('#type').val(type);
$('#search_tag>span').removeClass('selected');
$('#type_'+type).addClass('selected');
}
</script>                   这里是用JSfunction调用全站搜索的分类,分类设置在模块管理--全站搜索--分类管理
    <form name="search" action="{$MODULE[search][url]}" target="_blank">    全站搜索的表单里面包含name和动作action
      <div class="search_tag_top mar_10">
        <p id="search_tag"> <span id="type_all" class="selected" >全部</span> {php $types = cache_read('search_type.php');}       搜索条件的读取如:图片,资讯,cache_read()读取缓存文件函数,只要保存在缓存文件里面的都可以直接用该函数读取。
          {loop $types $type $name} <span id="type_{$type}" >{$name}</span> {/loop}   循环出全站搜索的分类  $types是在cache_read()函数读取缓存的时候将所有数据保存在该数组里面的,$type就是你在模块管理--全站搜索--类别管理的类别,如:news。$name是你想要保存的变量,可以自己定义,注意下面的输出是由这个变量控制的。
</p>
      </div>     
      <div class="cribox_bdr_1">
        <input type="hidden" name="type" value="all" id="type"/>
        <input type="text" name="q" size="50"/>
        <input type="submit" name="s" id="button" value="搜索" />
      </div>
    </form>
    <div class="cribox_btm"></div>
<!--{/if}-->
效果图:
 
posted @ 2009-04-01 10:32 张永耀 阅读(1305) | 评论 (0)编辑 收藏

tcp/ip

  TCP/IP协议(Transmission Control Protocol/Internet Protocol)叫做传输控制/网际协议,又叫网络通讯协议,这个协议是Internet国际互联网络的基础。
  TCP/IP是用于计算机通信的一组协议,我们通常称它为TCP/IP协议族。它是70年代中期美国国防部为其ARPANET广域网开发的网络体系结构和协议标准,以它为基础组建的INTERNET是目前国际上规模最大的计算机网络,正因为INTERNET的广泛使用,使得TCP/IP成了事实上的标准。
  TCP/IP是网络中使用的基本的通信协议。虽然从名字上看TCP/IP包括两个协议,传输控制协议(TCP)和网际协议(IP),但TCP/IP实际上是一组协议,它包括TCP、IP、UDP、ICMP、RIP、TELNET、FTP、SMTP、ARP、TFTP等许多协议,这些协议一起称为TCP/IP协议。
  TCP/IP由四个层次组成:数据链路层、网络层、传输层、应用层。
  一数据链路层
  这是TCP/IP软件的最低层,负责接收IP数据报并通过网络发送之,或者从网络上接收物理帧,抽出IP数据报,交给IP层。
  二网络层
  负责相邻计算机之间的通信。其功能包括三方面:
  1、处理来自传输层的分组发送请求,收到请求后,将分组装入IP数据报,填充报头,选择去往信宿机的路径,然后将数据报发往适当的网络接口。
  2、处理输入数据报:首先检查其合法性,然后进行寻径--假如该数据报已到达信宿机,则去掉报头,将剩下部分交给适当的传输协议;假如该数据报尚未到达信宿,则转发该数据报。
  3、处理路径、流控、拥塞等问题。
  三传输层
  提供应用程序间的通信。其功能包括:
  1、格式化信息流;
  2、提供可靠传输。为实现后者,传输层协议规定接收端必须发回确认,并且假如分组丢失,必须重新发送。
  四应用层
  向用户提供一组常用的应用程序,比如电子邮件、文件传输访问、远程登录等。远程登录TELNET使用TELNET协议提供在网络其它主机上注册的接口。TELNET会话提供了基于字符的虚拟终端。文件传输访问FTP使用FTP协议来提供网络内机器间的文件拷贝功能。
  OSI七层模型与TCP/IP协议的对应关系。
  OSI中的层 功能 TCP/IP协议族
  应用层 文件传输,电子邮件,文件服务,虚拟终端 TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet
  表示层 数据格式化,代码转换,数据加密 没有协议
  会话层 解除或建立与别的接点的联系 没有协议
  传输层 提供端对端的接口 TCP,UDP
  网络层 为数据包选择路由 IP,ICMP,RIP,OSPF,BGP,IGMP
  数据链路层 传输有地址的帧以及错误检测功能 SLIP,CSLIP,PPP,ARP,RARP,MTU
  物理层 以二进制数据形式在物理媒体上传输数据 ISO2110,IEEE802。IEEE802.2
  TCP/IP协议中一些常用协议英文名:
  TCP(Transmission Control Protocol)传输控制协议
  IP(Internet Protocol)网际协议
  UDP(User Datagram Protocol)用户数据报协议
  ICMP(Internet Control Message Protocol)互联网控制信息协议
  SMTP(Simple Mail Transfer Protocol)简单邮件传输协议
  SNMP(Simple Network manage Protocol)简单网络管理协议
  FTP(File Transfer Protocol)文件传输协议
  ARP(Address Resolation Protocol)地址解析协议
posted @ 2009-03-31 11:15 张永耀 阅读(151) | 评论 (0)编辑 收藏

TCP/IP协议

 

  TCP/IP(Transmission Control Protocol/Internet Protocol)的简写,中文译名为传输控制协议/互联网络协议)协议是Internet最基本的协议,简单地说,就是由网络层的IP协议和传输层的TCP协议组成的。

  众所周知,如今电脑上因特网都要作TCP/IP协议设置,显然该协议成了当今地球村“人与人”之间的“牵手协议”。

  1997年,为了褒奖对因特网发展作出突出贡献的科学家,并对TCP/IP协议作出充分肯定,美国授予为因特网发明和定义TCP/IP协议的文顿·瑟夫和卡恩“国家技术金奖”。这无疑使人们认识到TCP/IP协议的重要性。

  在阿帕网(ARPR)产生运作之初,通过接口信号处理机实现互联的电脑并不多,大部分电脑相互之间不兼容,在一台电脑上完成的工作,很难拿到另一台电脑上去用,想让硬件和软件都不一样的电脑联网,也有很多困难。当时美国的状况是,陆军用的电脑是DEC系列产品,海军用的电脑是Honeywell中标机器,空军用的是IBM公司中标的电脑,每一个军种的电脑在各自的系里都运行良好,但却有一个大弊病:不能共享资源。

  当时科学家们提出这样一个理念:“所有电脑生来都是平等的。”为了让这些“生来平等”的电脑能够实现“资源共享”就得在这些系统的标准之上,建立一种大家共同都必须遵守的标准,这样才能让不同的电脑按照一定的规则进行“谈判”,并且在谈判之后能“握手”。

  在确定今天因特网各个电脑之间“谈判规则”过程中,最重要的人物当数瑟夫(Vinton G.Cerf)。正是他的努力,才使今天各种不同的电脑能按照协议上网互联。瑟夫也因此获得了与克莱因罗克(“因特网之父”)一样的美称“互联网之父”。

  瑟夫从小喜欢标新立异,坚强而又热情。中学会书时,就被允许使用加州大学洛杉矶分校的电脑,他认为“为电脑编程序是个非常激动人心的事,…只要把程序编好,就可以让电脑做任何事情。”1965年,瑟夫从斯坦福大学毕业到IBM的一家公司当系统工程师,工作没多久,瑟夫就觉得知识不够用,于是到加州大学洛杉矶分校攻读博士,那时,正逢阿帕网的建立,“接口信号处理机”(IMP)的研试及网络测评中心的建立,瑟夫也成了著名科学家克莱因罗克手下的一位学生。瑟夫与另外三位年轻人(温菲尔德、克罗克、布雷登)参与了阿帕网的第一个节点的联接。此后不久,BBN公司对工作中各种情况发展有很强判断能力、被公认阿帕网建成作出巨大贡献的鲍伯·卡恩(Bob Kahn)也来到了加州大学洛杉矶分校。 在那段日子里,往往是卡恩提出需要什么软件,而瑟夫则通宵达旦地把符合要求的软件给编出来,然后他们一起测试这些软件,直至能正常运行。当时的主要格局是这样的,罗伯茨提出网络思想设计网络布局,卡恩设计阿帕网总体结构,克莱因罗克负责网络测评系统,还有众多的科学家、研究生参与研究、试验。69年9月阿帕网诞生、运行后,才发现各个IMP连接的时候,需要考虑用各种电脑都认可的信号来打开通信管道,数据通过后还要关闭通道。否则这些IMP不会知道什么时候应该接收信号,什么时候该结束,这就是我们现在所说的通信“协议”的概念。70年12月制定出来了最初的通信协议j 由卡恩开发、瑟夫参与的“网络控制协议”(NCP),但要真正建立一个共同的标准很不容易,72年10月国际电脑通信大会结束后,科学家们都在为此而努力。“包切换”理论为网络之间的联接方式提供了理论基础。卡恩在自己研究的基础上,认识到只有深入理解各种操作系统的细节才能建立一种对各种操作系统普适的协议,73年卡恩请瑟夫一起考虑这个协议的各个细节,他们这次合作的结果产生了目前在开放系统下的所有网民和网管人员都在使用的“传输控制协议”(TCP,Transsmission-Control Protocol)和“因特网协议”(IP,Internet Protocol)即TCP/IP协议。

  通俗而言:TCP负责发现传输的问题,一有问题就发出信号,要求重新传输,直到所有数据安全正确地传输到目的地。而IP是给因特网的每一台电脑规定一个地址。1974年12月,卡恩、瑟夫的第一份TCP协议详细说明正式发表。当时美国国防部与三个科学家小组签定了完成TCP/IP的协议,结果由瑟夫领衔的小组捷足先登,首先制定出了通过详细定义的TCP/IP协议标准。当时作了一个试验,将信息包通过点对点的卫星网络,再通过陆地电缆,再通过卫星网络,再由地面传输,贯串欧洲和美国,经过各种电脑系统,全程9.4万公里竟然没有丢失一个数据位,远距离的可靠数据传输证明了TCP/IP协议的成功。

  1983年1月1日,运行较长时期曾被人们习惯了的NCP被停止使用,TCP/IP协议作为因特网上所有主机间的共同协议,从此以后被作为一种必须遵守的规则被肯定和应用。正是由于TCP/IP协议,才有今天“地球村”因特网的巨大发展。

 
什么是 TCP/IP?

  TCP/IP 是供已连接因特网的计算机进行通信的通信协议。

  TCP/IP 指传输控制协议/网际协议 (Transmission Control Protocol / Internet Protocol)。

  TCP/IP 定义了电子设备(比如计算机)如何连入因特网,以及数据如何在它们之间传输的标准。
 

TCP/IP协议介绍

  

TCP/IP的通讯协议



  

  这部分简要介绍一下TCP/IP的内部结构,为讨论与互联网有关的安全问题打下基础。TCP/IP协议组之所以流行,部分原因是因为它可以用在各种各样的信道和底层协议(例如T1和X.25、以太网以及RS-232串行接口)之上。确切地说,TCP/IP协议是一组包括TCP协议和IP协议,UDP(User Datagram Protocol)协议、ICMP(Internet Control Message Protocol)协议和其他一些协议的协议组。

  

TCP/IP整体构架概述



  

  TCP/IP协议并不完全符合OSI的七层参考模型。传统的开放式系统互连参考模型,是一种通信协议的7层抽象的参考模型,其中每一层执行某一特定任务。该模型的目的是使各种硬件在相同的层次上相互通信。这7层是:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。而TCP/IP通讯协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。这4层分别为:

  应用层:应用程序间沟通的层,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。

  传输层:在此层中,它提供了节点间的数据传送服务,如传输控制协议(TCP)、用户数据报协议(UDP)等,TCP和UDP给数据包加入传输数据并把它传输到下一层中,这一层负责传送数据,并且确定数据已被送达并接收。

  互连网络层:负责提供基本的数据封包传送功能,让每一块数据包都能够到达目的主机(但不检查是否被正确接收),如网际协议(IP)。

  网络接口层:对实际的网络媒体的管理,定义如何使用实际网络(如Ethernet、Serial Line等)来传送数据。

  

TCP/IP中的协议



  以下简单介绍TCP/IP中的协议都具备什么样的功能,都是如何工作的:

  1. IP

  网际协议IP是TCP/IP的心脏,也是网络层中最重要的协议。

  IP层接收由更低层(网络接口层例如以太网设备驱动程序)发来的数据包,并把该数据包发送到更高层---TCP或UDP层;相反,IP层也把从TCP或UDP层接收来的数据包传送到更低层。IP数据包是不可靠的,因为IP并没有做任何事情来确认数据包是按顺序发送的或者没有被破坏。IP数据包中含有发送它的主机的地址(源地址)和接收它的主机的地址(目的地址)。

  高层的TCP和UDP服务在接收数据包时,通常假设包中的源地址是有效的。也可以这样说,IP地址形成了许多服务的认证基础,这些服务相信数据包是从一个有效的主机发送来的。IP确认包含一个选项,叫作IP source routing,可以用来指定一条源地址和目的地址之间的直接路径。对于一些TCP和UDP的服务来说,使用了该选项的IP包好像是从路径上的最后一个系统传递过来的,而不是来自于它的真实地点。这个选项是为了测试而存在的,说明了它可以被用来欺骗系统来进行平常是被禁止的连接。那么,许多依靠IP源地址做确认的服务将产生问题并且会被非法入侵。

  2. TCP

  如果IP数据包中有已经封好的TCP数据包,那么IP将把它们向‘上’传送到TCP层。TCP将包排序并进行错误检查,同时实现虚电路间的连接。TCP数据包中包括序号和确认,所以未按照顺序收到的包可以被排序,而损坏的包可以被重传。

  TCP将它的信息送到更高层的应用程序,例如Telnet的服务程序和客户程序。应用程序轮流将信息送回TCP层,TCP层便将它们向下传送到IP层,设备驱动程序和物理介质,最后到接收方。

  面向连接的服务(例如Telnet、FTP、rlogin、X Windows和SMTP)需要高度的可靠性,所以它们使用了TCP。DNS在某些情况下使用TCP(发送和接收域名数据库),但使用UDP传送有关单个主机的信息。

  3.UDP

  UDP与TCP位于同一层,但它不管数据包的顺序、错误或重发。因此,UDP不被应用于那些使用虚电路的面向连接的服务,UDP主要用于那些面向查询---应答的服务,例如NFS。相对于FTP或Telnet,这些服务需要交换的信息量较小。使用UDP的服务包括NTP(网络时间协议)和DNS(DNS也使用TCP)。

  欺骗UDP包比欺骗TCP包更容易,因为UDP没有建立初始化连接(也可以称为握手)(因为在两个系统间没有虚电路),也就是说,与UDP相关的服务面临着更大的危险。

  4.ICMP

  ICMP与IP位于同一层,它被用来传送IP的的控制信息。它主要是用来提供有关通向目的地址的路径信息。ICMP的‘Redirect’信息通知主机通向其他系统的更准确的路径,而‘Unreachable’信息则指出路径有问题。另外,如果路径不可用了,ICMP可以使TCP连接‘体面地’终止。PING是最常用的基于ICMP的服务。

  5. TCP和UDP的端口结构

  TCP和UDP服务通常有一个客户/服务器的关系,例如,一个Telnet服务进程开始在系统上处于空闲状态,等待着连接。用户使用Telnet客户程序与服务进程建立一个连接。客户程序向服务进程写入信息,服务进程读出信息并发出响应,客户程序读出响应并向用户报告。因而,这个连接是双工的,可以用来进行读写。

  两个系统间的多重Telnet连接是如何相互确认并协调一致呢?TCP或UDP连接唯一地使用每个信息中的如下四项进行确认:

  源IP地址 发送包的IP地址。

  目的IP地址 接收包的IP地址。

  源端口 源系统上的连接的端口。

  目的端口 目的系统上的连接的端口。

  端口是一个软件结构,被客户程序或服务进程用来发送和接收信息。一个端口对应一个16比特的数。服务进程通常使用一个固定的端口,例如,SMTP使用25、Xwindows使用6000。这些端口号是‘广为人知’的,因为在建立与特定的主机或服务的连接时,需要这些地址和目的地址进行通讯。

  

IP协议



   IP(Internet Protocol)协议的英文名直译就是:因特网协议。从这个名称我们就可以知道IP协议的重要性。在现实生活中,我们进行货物运输时都是把货物包装成一个个的纸箱或者是集装箱之后才进行运输,在网络世界中各种信息也是通过类似的方式进行传输的。IP协议规定了数据传输时的基本单元和格式。如果比作货物运输,IP协议规定了货物打包时的包装箱尺寸和包装的程序。 除了这些以外,IP协议还定义了数据包的递交办法和路由选择。同样用货物运输做比喻,IP协议规定了货物的运输方法和运输路线。

  

TCP协议



   我们已经知道了IP协议很重要,IP协议已经规定了数据传输的主要内容,那TCP(Transmission Control Protocol)协议是做什么的呢?不知大家发现没有,在IP协议中定义的传输是单向的,也就是说发出去的货物对方有没有收到我们是不知道的。就好像8毛钱一份的平信一样。那对于重要的信件我们要寄挂号信怎么办呢?TCP协议就是帮我们寄“挂号信”的。TCP协议提供了可靠的面向对象的数据流传输服务的规则和约定。简单的说在TCP模式中,对方发一个数据包给你,你要发一个确认数据包给对方。通过这种确认来提供可靠性。

  

1.1 TCP/IP参考模型



  TCP/IP协议并不完全符合OSI的七层参考模型。传统的开放式系统互连参考模型,是一种通信协议的7层抽象的参考模型,其中每一层执行某一特定任务。该模型的目的是使各种硬件在相同的层次上相互通信。这7层是:物理层、数据链路层、网路层、传输层、话路层、表示层和应用层。而TCP/IP通讯协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。这4层分别为:

  应用层:应用程序间沟通的层,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。

  传输层:在此层中,它提供了节点间的数据传送服务,如传输控制协议(TCP)、用户数据报协议(UDP)等,TCP和UDP给数据包加入传输数据并把它传输到下一层中,这一层负责传送数据,并且确定数据已被送达并接收。

  互连网络层:负责提供基本的数据封包传送功能,让每一块数据包都能够到达目的主机(但不检查是否被正确接收),如网际协议(IP)。

  网络接口层:对实际的网络媒体的管理,定义如何使用实际网络(如Ethernet、Serial Line等)来传送数据。

  

1. 2 网间协议IP



   Internet 上使用的一个关键的底层协议是网际协议,通常称IP协议。我们利用一个共同遵守的通信协议,从而使 Internet 成为一个允许连接不同类型的计算机和不同操作系统的网络。要使两台计算机彼此之间进行通信,必须使两台计算机使用同一种"语言"。通信协议正像两台计算机交换信息所使用的共同语言,它规定了通信双方在通信中所应共同遵守的约定。

  计算机的通信协议精确地定义了计算机在彼此通信过程的所有细节。例如,每台计算机发送的信息格式和含义,在什么情况下应发送规定的特殊信息,以及接收方的计算机应做出哪些应答等等。

  网际协议IP协议提供了能适应各种各样网络硬件的灵活性,对底层网络硬件几乎没有任何要求,任何一个网络只要可以从一个地点向另一个地点传送二进制数据,就可以使用IP协议加入 Internet 了。

  如果希望能在 Internet 上进行交流和通信,则每台连上 Internet 的计算机都必须遵守IP协议。为此使用 Internet 的每台计算机都必须运行IP软件,以便时刻准备发送或接收信息。

  IP协议对于网络通信有着重要的意义:网络中的计算机通过安装IP软件,使许许多多的局域网络构成了一个庞大而又严密的通信系统。从而使 Internet 看起来好像是真实存在的,但实际上它是一种并不存在的虚拟网络,只不过是利用IP协议把全世界上所有愿意接入 Internet 的计算机局域网络连接起来,使得它们彼此之间都能够通信。

  

1.3 传输控制协议TCP



  尽管计算机通过安装IP软件,从而保证了计算机之间可以发送和接收资料,但IP协议还不能解决资料分组在传输过程中可能出现的问题。因此,若要解决可能出现的问题,连上 Internet 的计算机还需要安装TCP协议来提供可靠的并且无差错的通信服务。

  TCP协议被称作一种端对端协议。这是因为它为两台计算机之间的连接起了重要作用:当一台计算机需要与另一台远程计算机连接时,TCP协议会让它们建立一个连接、发送和接收资料以及终止连接。

  传输控制协议TCP协议利用重发技术和拥塞控制机制,向应用程序提供可靠的通信连接,使它能够自动适应网上的各种变化。即使在 Internet 暂时出现堵塞的情况下,TCP也能够保证通信的可靠。

  众所周知, Internet 是一个庞大的国际性网络,网络上的拥挤和空闲时间总是交替不定的,加上传送的距离也远近不同,所以传输资料所用时间也会变化不定。TCP协议具有自动调整"超时值"的功能,能很好地适应 Internet 上各种各样的变化,确保传输数值的正确。

  因此,从上面我们可以了解到:IP协议只保证计算机能发送和接收分组资料,而TCP协议则可提供一个可靠的、可流控的、全双工的信息流传输服务。

  综上所述,虽然IP和TCP这两个协议的功能不尽相同,也可以分开单独使用,但它们是在同一时期作为一个协议来设计的,并且在功能上也是互补的。只有两者的结合,才能保证 Internet 在复杂的环境下正常运行。凡是要连接到 Internet 的计算机,都必须同时安装和使用这两个协议,因此在实际中常把这两个协议统称作TCP/IP协议。

  

1.4 IP地址及其分类



  在Internet上连接的所有计算机,从大型机到微型计算机都是以独立的身份出现,我们称它为主机。为了实现各主机间的通信,每台主机都必须有一个唯一的网络地址。就好像每一个住宅都有唯一的门牌一样,才不至于在传输资料时出现混乱。

  Internet的网络地址是指连入Internet网络的计算机的地址编号。所以,在Internet网络中,网络地址唯一地标识一台计算机。

  我们都已经知道,Internet是由几千万台计算机互相连接而成的。而我们要确认网络上的每一台计算机,靠的就是能唯一标识该计算机的网络地址,这个地址就叫做IP(Internet Protocol的简写)地址,即用Internet协议语言表示的地址。

  目前,在Internet里,IP地址是一个32位的二进制地址,为了便于记忆,将它们分为4组,每组8位,由小数点分开,用四个字节来表示,而且,用点分开的每个字节的数值范围是0~255,如202.116.0.1,这种书写方法叫做点数表示法。

  IP地址可确认网络中的任何一个网络和计算机,而要识别其它网络或其中的计算机,则是根据这些IP地址的分类来确定的。一般将IP地址按节点计算机所在网络规模的大小分为A,B,C三类,默认的网络屏蔽是根据IP地址中的第一个字段确定的。

  1. A类地址

  A类地址的表示范围为:10.0.0.0~126.255.255.255,默认网络屏蔽为:255.0.0.0;A类地址分配给规模特别大的网络使用。A类网络用第一组数字表示网络本身的地址,后面三组数字作为连接于网络上的主机的地址。分配给具有大量主机(直接个人用户)而局域网络个数较少的大型网络。例如IBM公司的网络。

  2. B类地址

  B类地址的表示范围为:127.0.0.0~191.255.255.255,默认网络屏蔽为:255.255.0.0;B类地址分配给一般的中型网络。B类网络用第一、二组数字表示网络的地址,后面两组数字代表网络上的主机地址。

  3. C类地址

  C类地址的表示范围为:192.0.0.0~223.255.255.255,默认网络屏蔽为:255.255.255.0;C类地址分配给小型网络,如一般的局域网,它可连接的主机数量是最少的,采用把所属的用户分为若干的网段进行管理。C类网络用前三组数字表示网络的地址,最后一组数字作为网络上的主机地址。

  RFC 1918留出了3块IP地址空间(1个A类地址段,16个B类地址段,256个C类地址段)作为私有的内部使用的地址。在这个范围内的IP地址不能被路由到Internet骨干网上;Internet路由器将丢弃该私有地址。

  IP地址类别 RFC 1918内部地址范围

  A类 10.0.0.0到10.255.255.255

  B类 172.16.0.0到172.31.255.255

  C类 192.168.0.0到192.168.255.255

  使用私有地址将网络连至Internet,需要将私有地址转换为公有地址。这个转换过程称为网络地址转换(Network Address Translation,NAT),通常使用路由器来执行NAT转换。

  实际上,还存在着D类地址和E类地址。但这两类地址用途比较特殊,在这里只是简单介绍一下:D类地址称为广播地址,供特殊协议向选定的节点发送信息时用。E类地址保留给将来使用。

  连接到Internet上的每台计算机,不论其IP地址属于哪类都与网络中的其它计算机处于平等地位,因为只有IP地址才是区别计算机的唯一标识。所以,以上IP地址的分类只适用于网络分类。

  在Internet中,一台计算机可以有一个或多个IP地址,就像一个人可以有多个通信地址一样,但两台或多台计算机却不能共享一个IP地址。如果有两台计算机的IP地址相同,则会引起异常现象,无论哪台计算机都将无法正常工作。

  顺便提一下几类特殊的IP地址:

  1. 广播地址 目的端为给定网络上的所有主机,一般主机段为全0

  2. 单播地址 目的端为指定网络上的单个主机地址

  3. 组播地址 目的端为同一组内的所有主机地址

  4. 环回地址 127.0.0.1 在环回测试和广播测试时会使用

  

1.5 子网的划分



  

  若公司不上Internet,那一定不会烦恼IP地址的问题,因为可以任意使用所有的IP地址,不管是A类或是B类,这个时候不会想到要用子网,但若是上Internet那IP地址便弥足珍贵了,目前全球一阵Internet热,IP地址已经愈来愈少了,而所申请的IP地址目前也趋保守,而且只有经申请的IP地址能在Internet使用,但对某些公司只能申请到一个C类的IP地址,但又有多个点需要使用,那这时便需要使用到子网,这就需要考虑子网的划分,下面简介子网的原理及如何规划。

  1.5.1 子网掩码(Subnet Mask)的介绍

  设定任何网络上的任何设备不管是主机、个人电脑、路由器等皆需要设定IP地址,而跟随着IP地址的是所谓的子网掩码(NetMask,Subnet Mask),这个子网掩码主要的目的是由IP地址中也能获得网络编码,也就是说IP地址和子网掩码作和而得到网络编码,如下所示:

  IP地址

  192.10.10.6 11000000.00001010.00001010.00000110

  子网掩码

  255.255.255.0 11111111.11111111.11111111.00000000

  AND

  -------------------------------------------------------------------

  Network Number

  192.10.10.0 11000000.00001010.00001010.00000000

  子网掩码有所谓的默认值,如下所示

  类 IP地址 范围 子网掩码

  A 1.0.0.0-126.255.255.255 255.0.0.0

  B 128.0.0.0-191.255.255.255 255.255.0.0

  C 192.0.0.0-223.255.255.255 255.255.255.0

  在预设的子网掩码(Net Mask)都只有255的值,在谈到子网掩码(Subnet Mask)时这个值便不一定是255了。在完整一组C类地址中如203.67.10.0-203.67.10.255 子网掩码255.255.255.0,203.67.10.0称之网络编码(Network Number,将IP 地址和子网掩码作和),而203.67.10.255是广播的IP地址,所以这两者皆不能使用,实际只能使用203.67.10.1--203.67.10.254等254个IP地址,这是以255.255.255.0作子网掩码的结果,而所谓Subnet Msk尚可将整组C类地址分成数组网络编码,这要在子网掩码上作手脚,若是要将整组C类地址分成2个网络编码那子网掩码设定为255.255.255.128,若是要将整组C类分成8组网络编码则子网掩码要为255.255.255.224,这是怎么来的,由以上知道网络编码是由IP地址和子网掩码作AND而来的,而且将子网掩码以二进制表示法知道是1的会保留,而为0的去掉

  192.10.10.193--11000000.00001010.00001010.11000001

  255.255.255.0--11111111.11111111.11111111.00000000

  --------------------------------------------------------------

  192.10.10.0--11000000.00001010.00001010.00000000

  以上是以255.255.255.0为子网掩码的结果,网络编码是192.10.10.0,若是使用255.255.255.224作子网掩码结果便有所不同

  192.10.10.193--11000000.00001010.00001010.11000001

  255.255.255.224--11111111.11111111.11111111.11100000

  --------------------------------------------------------------

  192.10.10.192--11000000.00001010.00001010.11000000

  此时网络编码变成了192.10.10.192,这便是子网。那要如何决定所使用的子网掩码,255.255.255.224以二进制表示法为11111111.11111111.11111111.11100000,变化是在最后一组,11100000便是224,以三个位(Bit)可表示2的3次方便是8个网络编码

  子网掩码二进制表示法可分几个网络

  255.255.255.011111111.11111111.11111111.000000001

  255.255.255.128

  11111111.11111111.11111111.100000002

  255.255.255.192

  11111111.11111111.11111111.110000004

  255.255.255.224

  11111111.11111111.11111111.111000008

  255.255.255.240

  11111111.11111111.11111111.1111000016

  255.255.255.248

  11111111.11111111.11111111.1111100032

  255.255.255.252

  11111111.11111111.11111111.1111110064

  以下使用255.255.255.224将C类地址203.67.10.0分成8组网络编码,各个网络编码及其广播IP地址及可使用之IP地址序号网络编码广播可使用之IP地址

  (1)203.67.10.0--203.67.10.31

  203.67.10.1--203.67.10.30

  (2)203.67.10.32--203.67.10.63

  203.67.10.33--203.67.10.62

  (3)203.67.10.64--203.67.10.95

  203.67.10.65--203.67.10.94

  (4)203.67.10.96--203.67.10.127

  203.67.10.97--203.67.10.126

  (5)203.67.10.128--203.67.10.159

  203.67.10.129--203.67.10.158

  (6)203.67.10.160--203.67.10.191

  203.67.10.161--203.67.10.190

  (7)203.67.10.192--203.67.10.223

  203.67.10.193--203.67.10.222

  (8)203.67.10.224--203.67.10.255

  203.67.10.225--203.67.10.254

  可验证所使用的IP地址是否如上表所示

  203.67.10.115--11001011.01000011.00001010.01110011

  255.255.255.224--11111111.11111111.11111111.11100000

  --------------------------------------------------------------

  203.67.10.96--11001011.01000011.00001010.01100000

  203.67.10.55--11001011.01000011.00001010.00110111

  255.255.255.224--11111111.11111111.11111111.11100000

  --------------------------------------------------------------

  203.67.10.32--11001011.01000011.00001010.00100000

  其它的子网掩码所分成的网络编码可自行以上述方法自行推演出来。

  1.5.3 子网的应用

  使用子网是要解决只有一组C类地址但需要数个网络编码的问题,并不是解决IP地址不够用的问题,因为使用子网反而能使用的IP地址会变少,子网通常是使用在跨地域的网络互联之中,两者之间使用路由器连线,同时也上Internet,但只申请到一组C 类IP地址,过路由又需不同的网络,所以此时就必须使用到子网,当然二网络间也可以远程桥接(Remote Bridge,字面翻译)连接,那便没有使用子网的问题。

  网关地址

  若要使两个完全不同的网络(异构网)连接在一起,一般使用网关,在Internet中两个网络也要通过一台称为网关的计算机实现互联。这台计算机能根据用户通信目标计算机的IP地址,决定是否将用户发出的信息送出本地网络,同时,它还将外界发送给属于本地网络计算机的信息接收过来,它是一个网络与另一个网络相联的通道。为了使TCP/IP协议能够寻址,该通道被赋予一个IP地址,这个IP地址称为网关地址。

  完美测试TCP/IP协议简介

  安装网络硬件和网络协议之后,我们一般要进行TCP/IP协议的测试工作,那么怎样测试才算是比较全面的测试呢?我们认为,全面的测试应包括局域网和互联网两个方面,因此应从局域网和互联网两个方面测试,以下是我们在实际工作中利用命令行测试TCP/IP配置的步骤:

  1、 单击“开始”/“运行”,输入CMD按回车,打开命令提示符窗口。

  2、 首先检查IP地址、子网掩码、默认网关、DNS服务器地址是否正确,输入命令ipconfig /all,按回车。此时显示了你的网络配置,观查是否正确。

  3、 输入ping 127.0.0.1,观查网卡是否能转发数据,如果出现“Request timed out”,表明配置差错或网络有问题。

  4、 Ping一个互联网地址,如ping 202.102.128.68,看是否有数据包传回,以验证与互联网的连接性。

  5、 Ping 一个局域网地址,观查与它的连通性。

  6、 用nslookup测试DNS解析是否正确,输入如nslookup www.ccidnet.com,查看是否能解析。

  如果你的计算机通过了全部测试,则说明网络正常,否则网络可能有不同程度的问题。在此不展开详述。不过,要注意,在使用 ping命令时,有些公司会在其主机设置丢弃ICMP数据包,造成你的ping命令无法正常返回数据包,不防换个网站试试。

  补充:
 

TCP/IP 协议簇

  TCP/IP(Transmission Control Protocol/Internet Protocol)已成为一个事实上的工业

  标准。

  TCP/IP是一组协议的代名词,它还包括许多协议,组成了TCP/IP协议簇。

  TCP/IP协议簇分为四层,IP位于协议簇的第二层(对应OSI的第三层),TCP位于协议簇的第

  三层(对应OSI的第四层)。

  TCP和IP是TCP/IP协议簇的中间两层,是整个协议簇的核心,起到了承上启下的作用。

  1、接口层

  TCP/IP的最低层是接口层,常见的接口层协议有:

  Ethernet 802.3、Token Ring 802.5、X.25、Frame reley、HDLC、PPP等。

  2、网络层

  网络层包括:IP(Internet Protocol)协议、ICMP(Internet Control Message Protocol)

  控制报文协议、ARP(Address Resolution Protocol)地址转换协议、RARP(Reverse ARP)反向

  地址转换协议。

  IP是网络层的核心,通过路由选择将下一跳IP封装后交给接口层。IP数据报是无连接服务

  。

  ICMP是网络层的补充,可以回送报文。用来检测网络是否通畅。

  Ping命令就是发送ICMP的echo包,通过回送的echo relay进行网络测试。

  ARP是正向地址解析协议,通过已知的IP,寻找对应主机的MAC地址。

  RARP是反向地址解析协议,通过MAC地址确定IP地址。比如无盘工作站和DHCP服务。

  3、传输层

  传输层协议主要是:传输控制协议TCP(Transmission Control Protocol)和用户数据报协

  议UDP(User Datagram rotocol)。

  TCP是面向连接的通信协议,通过三次握手建立连接,通讯时完成时要拆除连接,由于TCP

  是面向连接的所以只能用于点对点的通讯。

  TCP提供的是一种可靠的数据流服务,采用“带重传的肯定确认”技术来实现传输的可靠

  性。TCP还采用一种称为“滑动窗口”的方式进行流量控制,所谓窗口实际表示接收能力,用

  以限制发送方的发送速度。

  UDP是面向无连接的通讯协议,UDP数据包括目的端口号和源端口号信息,由于通讯不需要

  连接,所以可以实现广播发送。

  UDP通讯时不需要接收方确认,属于不可靠的传输,可能会出丢包现象,实际应用中要求

  在程序员编程验证。

  4、应用层

  应用层一般是面向用户的服务。如FTP、TELNET、DNS、SMTP、POP3。

  FTP(File Transmision Protocol)是文件传输协议,一般上传下载用FTP服务,数据端口

  是20H,控制端口是21H。

  Telnet服务是用户远程登录服务,使用23H端口,使用明码传送,保密性差、简单方便。

  DNS(Domain Name Service)是域名解析服务,提供域名到IP地址之间的转换。

  SMTP(Simple Mail Transfer Protocol)是简单邮件传输协议,用来控制信件的发送、中

  转。 

  POP3(Post Office Protocol 3)是邮局协议第3版本,用于接收邮件。

  数据格式:

  数据帧:帧头+IP数据包+帧尾 (帧头包括源和目标主机MAC地址及类型,帧尾是校验字)

  IP数据包:IP头部+TCP数据信息 (IP头包括源和目标主机IP地址、类型、生存期等)

  TCP数据信息:TCP头部+实际数据 (TCP头包括源和目标主机端口号、顺序号、确认号、校

  验字等)
posted @ 2009-03-31 10:54 张永耀 阅读(175) | 评论 (0)编辑 收藏

TCP:Transmission Control Protocol 传输控制协议

  首先,TCP建立连接之后,通信双方都同时可以进行数据的传输,其次,他是全双工的;在保证可靠性上,采用超时重传和捎带确认机制。

  在流量控制上,采用滑动窗口协议,协议中规定,对于窗口内未经确认的分组需要重传。

  在拥塞控制上,采用慢启动算法。

  注解:该协议主要用于在主机间建立一个虚拟连接,以实现高可靠性的数据包交换。IP协议可以进行IP数据包的分割和组装,但是通过IP协议并不能清楚地了解到数据包是否顺利地发送给目标计算机。而使用TCP协议就不同了,在该协议传输模式中在将数据包成功发送给目标计算机后,TCP会要求发送一个确认;如果在某个时限内没有收到确认,那么TCP将重新发送数据包。另外,在传输的过程中,如果接收到无序、丢失以及被破坏的数据包,TCP还可以负责恢复。

  传输控制协议(Transmission Control Protocol,TCP)是一种面向连接的、可靠的、基于字节流的运输层通信协议,通常由IETF的RFC 793说明。在简化的计算机网络OSI模型中,它完成运输层所指定的功能。

  什么是TCP/IP?

  TCP/IP(Transmission Control Protocol/Internet Protocol) 即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域网(WANs)设计的。它是由ARPANET网的研究机构发展起来的。

  有时我们将TCP/IP描述为互联网协议集\"Internet Protocol Suite\",TCP和IP是其中的两个协议(后面将会介绍)。由于TCP和IP是大家熟悉的协议,以至于用TCP/IP或IP/TCP这个词代替了整个协议集。这尽管有点奇怪,但没有必要去争论这个习惯。例如,有时我们讨论NFS 是基于TCP/IP时,尽管它根本没用到TCP(只用到IP,和另一种交互式 协议UDP而不是TCP)。

  Internet是网络的集合,包括ARPANET、NSFNET、分布在各地的局域网、以及其它类型的网络,如(DDN,Defense Data Network美国国防数据网络),这些统称为Internet。所有这些大大小小的网络互联在一起。(因为大多数网络基本协议是由DDN组织开发的,所以以前有时DDN与Internet在某种意义上具有相同的含义)。网络上的用户可以互相传送信息,除一些有授权限制和安全考虑外。一般的讲,互联网协议文档案是Internet委员会自己采纳的基本标准。 TCP/IP标准与其说由委员会指定,倒不如说由\"舆论\"来开发的。 任何人都可以提供一个文档,以RFC(Request for Comment需求注释) 方式公布。

  TCP/IP的标准在一系列称为RFC的文档中公布。文档由技术专家、特别工作组、或RFC编辑修订。公布一个文档时,该文档被赋予一个RFC量,如RFC959说明FTP、RFC793说明TCP、RFC791说明IP等。 最初的RFC一直保留而从来不会被更新,如果修改了该文档,则该文档又以一个新号码公布。因此,重要的是要确认你拥有了关于某个专题的最新RFC文档。文后会列出主要的RFC文档号。

  不管怎样,TCP/IP是一个协议集。为应用提供一些\"低级\"功能,这些包括IP、TCP、UDP。其它是执行特定任务的应用协议,如计算机间传送文件、发送电子邮件、或找出谁注册到另外一台计算机。因此, 最重要的\"商业\"TCP/IP服务有:

  * 文件传送File Transfer。

  文件传送协议FTP(File Transfer Protocol)允许用户从一台计算机到另一台取得文件,或发送文件到另外一台计算机。从安全性方面考虑,需要用户指定一个使用其它计算机的用户名和口令。它不同与NFS(Network File System)和Netbios协议。一旦你要访问另一台 系统中的文件,任何时刻都要运行FTP。而且你只能拷贝文件到自己的机器中去来使用它。(RFC 959中关于FTP的说明)

  * 远程登录Remote login

  网络终端协议TELNET允许用户登录到网络上任一计算机上。你可启动一个远程进程连接到指定的计算机,直到进程结束,期间你所键入的内容被送到所指定的计算机。值得注意的是,这时你实际上是与你的计算机进行对话。TELENET程序使得你的计算机在整个过程中不见了,所敲的每一个字符直接送到所登录的计算机系统。一般的说,这种远程连接是通过类式拨号连接的,也就是,拨通后,远程系统提示你输入注册名和口令,退出远程系统,TELNET程序也就退出,你又与自己的计算机对话了。微电脑中的TELNET工具一般含有一个终端仿真程序。

  * 计算机邮件Mail

  允许你发送消息给其它计算机的用户。通常,人们趋向于使用指定的一台或两台计算机。计算机邮件系统只需你简单地往另一用户的邮件文件中添加信息,但随之产生问题,使用的微电脑的环境不同,还有重要的是宏(MICRO)不适合于接受计算机邮件。为了发送电子邮件,邮件软件希望连接到目的计算机,如果是微电脑,也许它已关机,或者正在运行另一个应用程序呢?出于这种原因,通常由一个较大的系统来处理这些邮件,也就是一个一直运行着的邮件服务器。邮件软件成为用户从邮件服务器取回邮件的一个界面。

  任何一个的TCP/IP工具提供上述这些服务。这些传统的应用功能在基于TCP/IP的网络中一直扮演非常重要的角色。目前情况有点变化,这些功能使用也发生变化,如老系统的改造,计算机的发展等,出现了各种安装版本,如:微电脑、工作站、小型机、和巨型机等。这些计算机好像在一起完成指定的任务,尽管有时看来像是只用到某个指定 的计算机,但它是通过网络得到其它计算机系统的服务。服务器Server是为网络上其它提供指定服务的系统,客户Client是得到这种服务的另外计算机系统。(值得注意的是,服务/客户机不一定是不同的计算机,有可能是同一计算机中的不同运行程序)。以下是几种目前计算机上典型的一些服务,这些服务可在TCP/IP网络上调用。

  * 网络文件系统(NFS)

  这种访问另一计算机的文件的方法非常接近于流行的FTP。网络文件系统提供磁盘或设备服务,而无需特定的网络实用程序来访问另一系统的文件。可以简单地认为它是一个外加的磁盘驱动器。这种额外\"虚拟\"磁盘驱动器就是其它计算机系统的磁盘。这非常有用。你只需加大几台计算机的磁盘容量,就可使网络上其他用户访问它,且不说所带来的经济效益,它还能够让几台工作的计算机共享相同的文件。它也使得系统维护和备份易如反掌,因为再不必为大量的不同机器上 的文件的升级和备份而担心。

  * 远程打印(Remote printing)

  允许你使用其它计算机上的打印机,好像这些打印机直接连到你的计算机上。

  * 远程执行(Remote execution)

  允许你请求运行在不同计算机上的特殊程序。当你在一个很小的计算机上运行一个需要大机系统资源的程序时,这时候远程执行非常有用。

  * 名字服务器(Name servers)

  在一个大的系统安装过程中,需要用到大量的各种名字,包括用户名、口令,姓名、网络地址、帐号等,管理这些是非常令人乏味的。因此将这些数据形成数据库,放到一个小系统中去,其它系统通过网络来访问这些数据。

  * 终端服务器(Terminal servers)

  很多的终端连接安装不再直接将终端连到计算机,取而代之的是,将他们连接到终端服务器上。终端服务器是一个小的计算机,它只需知道怎样运行TELNET(或其它一些完成远程登录的协议)。如果你的终端想连上去,只用键入要连的计算机名就可。通常有可能同时有几个这种连接,这时终端服务器采用快速开关技术来切换。

  上述所描述的一些协议是由Berkeley, Sun,或其它组织定义的。因此,它们不是互联网协议集(Internet Protocol Suite)的一部分, 只是使用到TCP/IP的工具,如同一般的TCP/IP 应用协议。因为协议的定义不一致,并且商业支持的TCP/IP工具广泛应用,也许会把这些协议作为互联协议集中的一部分。上述列出的只是基于TCP/IP部分服务的一些简单例子,但包含了一些\"主要\"的应用。

  TCP的服务

  TCP协议提供的是可靠的、面向连接的传输控制协议,即在传输数据前要先建立逻辑连接,然后再传输数据,最后释放连接3个过程。TCP提供端到端、全双工通信;采用字节流方式,如果字节流太长,将其分段;提供紧急数据传送功能。

  尽管TCP和UDP都使用相同的网络层(IP),TCP却向应用层提供与UDP完全不同的服务。

  TCP提供一种面向连接的、可靠的字节流服务。

  面向连接意味着两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数据之前必须先建立一个TCP连接。这一过程与打电话很相似,先拨号振铃,等待对方摘机说“喂”,然后才说明是谁。

  在一个TCP连接中,仅有两方进行彼此通信。广播和多播不能用于TCP。

  TCP通过下列方式来提供可靠性:

  •应用数据被分割成TCP认为最适合发送的数据块。这和UDP完全不同,应用程序产生的数据报长度将保持不变。由TCP传递给IP的信息单位称为报文段或段(segment)TCP如何确定报文段的长度。

  •当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。•当TCP收到发自TCP连接另一端的数据,它将发送一个确认。这个确认不是立即发送,通常将推迟几分之一秒

  •TCP将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP将丢弃这个报文段和不确认收到此报文段(希望发端超时并重发)。

  •既然TCP报文段作为IP数据报来传输,而IP数据报的到达可能会失序,因此TCP报文段的到达也可能会失序。如果必要,TCP将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。

  •既然IP数据报会发生重复,TCP的接收端必须丢弃重复的数据。

  •TCP还能提供流量控制。TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据。这将防止较快主机致使较慢主机的缓冲区溢出。

  两个应用程序通过TCP连接交换8bit字节构成的字节流。TCP不在字节流中插入记录标识符。我们将这称为字节流服务(bytestreamservice)。如果一方的应用程序先传10字节,又传20字节,再传50字节,连接的另一方将无法了解发方每次发送了多少字节。收方可以分4次接收这80个字节,每次接收20字节。一端将字节流放到TCP连接上,同样的字节流将出现在TCP连接的另一端。

  另外,TCP对字节流的内容不作任何解释。TCP不知道传输的数据字节流是二进制数据,还是ASCII字符、EBCDIC字符或者其他类型数据。对字节流的解释由TCP连接双方的应用层解释。

  这种对字节流的处理方式与Unix操作系统对文件的处理方式很相似。Unix的内核对一个应用读或写的内容不作任何解释,而是交给应用程序处理。对Unix的内核来说,它无法区分一个二进制文件与一个文本文件。

  TCP是因特网中的传输层协议,使用三次握手协议建立连接。当主动方发出SYN连接请求后,等待对方回答SYN,ACK。这种建立连接的方法可以防止产生错误的连接,TCP使用的流量控制协议是可变大小的滑动窗口协议。第一次握手:建立连接时,客户端发送SYN包(SEQ=x)到服务器,并进入SYN_SEND状态,等待服务器确认。第二次握手:服务器收到SYN包,必须确认客户的SYN(ACK=x+1),同时自己也送一个SYN包(SEQ=y),即SYN+ACK包,此时服务器进入SYN_RECV状态。第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ACK=y+1),此包发送完毕,客户端和服务器时入Established状态,完成三次握手。

  TCP建立连接时的三次握手
posted @ 2009-03-31 10:06 张永耀 阅读(165) | 评论 (0)编辑 收藏

1.作用的范围不同:

1)inverse :<set/>,<map/>,<list/>,<array/>,<bag/>

2)cascade :<many-to-one>,<one-to-one/>,<set/>,<map/>,<list/>,<array/>,<bag/>.

2.执行策略不同

1)inverse :首先判断集合的变化情况,然后针对变化执行相应的处理。

2)cascade :直接对集合中的每个元素执行相应的处理。

3.执行的时机不同

1)inverse :在执行SQL语句之前判断是否要执行该SQL语句。

2)cascade :在主控方发生操作时用来判断是否进行级联操作。

4.执行的目标不同

1)inverse :对于<one-to-many>处理被管理表,<many-to-many/>处理中间表。

2)cascade :都只只对被关联表。

总结:书上说了inverse 一对多的时候最好把多的一方设置成false由一的一方来控制;cascade尽量别使,进行显示的添加删除。

posted @ 2009-03-30 16:46 张永耀 阅读(172) | 评论 (0)编辑 收藏

构造这样一个例子,在测试过程中来说明一些Hibernate的高级配置及其相关机制:
有三个类:Category.java,Prodcuct.java,ConfigurationTest.java,其中第三个类是用来测试的。
Category.java代码:
       

package unsaved_value;    
import ......    
public class Category {    
    private Integer id;    
    private String name;    
    private String description;    
    private Set products;    
    public Category(){    
         id=null;    
         name=null;    
        description=null;    
        products=new HashSet ();    
     }    
     public void addProduct(Product p){    
         products.add(p);    
    }    
     //**********setter and getter    
    ........    
}   


Product.java代码:


package unsaved_value;      
public class Product {      
    private Integer id;      
    private String name;      
    private Category category;      
    private String description;      
    public Product(){     
         
    }      
     //*******getter and setter      
     .........      
}      

ConfigurationTest.java

public void testSave()throws Exception{    
        Category category=new Category();    
        category.setName("java编程书籍2");    
        category.setDescription("编程经典书籍2");    
        Product pro=new Product();    
        pro.setName("java编程思想2");    
        pro.setDescription("第四版中文版2");     
        pro.setCategory(category);    
        category.addProduct(pro);    
        Transaction tx=session.beginTransaction();    
        assert (session!=null):("session is null");    
        session.save(category);    
        tx.commit();    
    }    

     
Category代表产品目录,而Product代表产品,显然Category与Product是一对多的关系。Hibernate在映射一对多关系时,有两种方式,一种是单向一对多,一种是双向关系。两者相比,双向一对多的好处体现在两方面:首先,也是很明显的一点,由于是双向关联,我们在实际业务逻辑时将更方便,例如我们可以检索一个Category下的所有Product,同时还可以检索出Product属于哪个。其次,双向关系相对单向关系而言,在数据库的访问方面更有优势。这一点留在后面讲inverse时讲
。双向关联比单向关联唯一的”劣势“,就在于双向关联需要比单向关联多写一个映射文件,这不问题。使用双向关联实现这两个类同数据库的映射:

Category.hbm.xml:  
version="1.0" encoding="UTF-8"?>  

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >  
<hibernate-mapping package="unsaved_value">  
   <class name="Category" table="category">  
     <id name="id" column="id">  
       <generator class="native">generator>  
     id>  
     
     <property name="name" column="name"/>  
     <property name="description" column="description"/>


     <set name="products" table="product" lazy="true" inverse="true" cascade="all">  
         <key column="category"/>  
            <one-to-many class="Product"/>  
     set>  
     
   class>  
hibernate-mapping>  
  
Product.hbm.xml:


version="1.0" encoding="UTF-8"?>    
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >    
<hibernate-mapping package="unsaved_value">    
<class name="Product" table="product">    
     <id name="id" column="id" unsaved-value="null">    
         <generator class="native">generator>    
     id>    
         
     <property name="name" column="name"/>    
     <property name="description" column="description"/>    
       
     <many-to-one name="category"    
                  column="category"     
                  class="Category"    
     />    
   class>    
hibernate-mapping>    
        
现在把这个例子所牵涉到的知识一一展开:
一.inverse
    该词的译意是“反转”,反转什么——反转控制端,这项配置决定了由关联双方中的哪一方来维持关联关系(在数据库中表现为外键约束)。上述配置中,在Category.hbm.xml中将inverse设置为true,意思是说“我需要反转(控制端)”,反转的结果是由对方即Product来维持关联关系。用单向关联更容易说明”维持关联关系“是什么意思:考虑用单向关系来实现这个映射关系的情况,即由Category关联到Product,考虑下面的代码:

Product p=new Product();  
..setXXX  
Category c=new Category();  
..设置Category的属性  
c.addProduct(p);//建立起了c和p的关联关系  
session.save(c);  

会执行三条SQL语句:两条插入语句,分别插入c和p,然后还有一条update语句建立起c和p的关联(更新p的外键)。上面,我们说由Category端控制关联,因此p.setCategory(c)这样一句话是没用的,它并不会导致在插入p的时候就设置p的外键以建立起两者的关联关系,从而节省一条update语句。同时我们还会看到,如果在数据库模式中将p的外键设置成非空,这些代码将不能执行,因为在插入p时,由于c和p的关联关系还未建立起来,因此p的外键为空。回到双向关联上来,为了更清楚地明白inverse在双向关联中到底起什么作用,我们分别将其值设为true和false,看看打印出的的SQL有何区别:

inverse=true时的打印结果:

Hibernate: insert into category (name, description) values (?, ?)  
Hibernate: insert into product (name, description, category) values (?, ?, ?)   
inverse=false时的打印结果:

Hibernate: insert into category (name, description) values (?, ?)    
Hibernate: insert into product (name, description, category) values (?, ?, ?)    
Hibernate: update product set category=? where id=?   
       为什么inverse=true时会比inverse=false时少执行一条SQL语句?这是由控制端的不同造成的。前者说"我要反转控制,由Product来控制关联",因此在将p对象insert时,p已经设置了其category字段,从而建立了关联关系,而后者说"我不反转控制,由我自己来控制关联",因此在将p对象insert后,c为了维持两者的关联,还要去执行一次update,以更新p的外键,从而建立起两者的关联关系。
结论:对于一对多双向关系,始终在“一”那一方将其inverse设置成true,这样会提高性能。

二.cascade
   级联。当关联的"一"方进行某种动作(更新,删除)时,"多"方即使没有显式地进行编码,它也会自动进行同样的动作。cascade的可选值有:
all : 所有情况下均进行关联操作。即是save-update + delete
none:所有情况下均不进行关联操作。这是默认值。
save-update:在执行save/update/saveOrUpdate时进行关联操作。
delete:在执行delete时进行关联操作。
all-delete-orphan:A:级联save-update B级联delete C:删除所有孤儿项(orphan孤儿)。先看看父子关系,例如在Customer和Order的模型中,这两者便是父子关系,当一个Customer的生命周期决定Order的生命周期,如果一个Customer不在了,其相关的Order继续存在是毫无业务意义的。删除所有孤儿项的意思即是,删除所有与父对象失去关联关系的子对象。

三.lazy
    是否延迟加载。一般来说,应该延迟加载,即将lazy设为true。延迟加载的相关点很多,这在另外的学习笔记中总结。

四.unsaved-value
    以上是"一"方的重要配置,再看看"多"方的一个重要配置:unsaved-value,就像上面Product.hbm.xml中的设置那样,这一项在id的配置中设置。这一设置是与级联一起工作的。关于这一点,robbin讲的很清楚:
当你显式的使用session.save()或者session.update()操作一个对象的时候,实际上是用不到unsaved-value 的。某些情况下(父子表关联保存),当你在程序中并没有显式的使用save或者update一个持久对象,那么Hibernate需要判断被操作的对象究竟是一个已经持久化过的持久对象,是一个尚未被持久化过的内存临时对象。例如:
       Session session = ...;
Transaction tx = ...;  
Parent parent = (Parent) session.load(Parent.class, id);  
Child child = new Child();  
child.setParent(parent);  
child.setName("sun");  
parent.addChild(child);  
s.update(parent);  
s.flush();  
tx.commit();  
s.close();  
     在上例中,程序并没有显式的session.save(child); 那么Hibernate需要知道child究竟是一个临时对象,还是已经在数据库中有的持久对象。如果child是一个新创建的临时对象(本例中就是这种情况),那么Hibernate应该自动产生session.save(child)这样的操作,如果child是已经在数据库中有的持久对象,那么 Hibernate应该自动产生session.update(child)这样的操作。因此我们需要暗示一下Hibernate,究竟 child对象应该对它自动save还是update。在上例中,显然我们应该暗示Hibernate对child自动save,而不是自动 update。那么Hibernate如何判断究竟对child是save还是update呢?它会取一下child的主键属性 child.getId() ,这里假设id是 java.lang.Integer类型的。如果取到的Id值和hbm映射文件中指定的unsave-value相等,那么Hibernate认为 child是新的内存临时对象,发送save,如果不相等,那么Hibernate认为child是已经持久过的对象,发送update。unsaved-value="null" (默认情况,适用于大多数对象类型主键 Integer/Long/String/...)
当Hibernate取一下child的Id,取出来的是null(在上例中肯定取出来的是null),和unsaved-value设定值相等,发送save(child)
当Hibernate取一下child的id,取出来的不是null,那么和unsaved-value设定值不相等,发送update(child)
   unsaved-value的可选配置有:
none,any,null
unsaved-value="none"和unsaved-value="any"主要用在主键属性不是通过Hibernate生成,而是程序自己setId()的时候。unsaved-value="none"和unsaved-value="any"究竟有什么含义了。如果你非要用assigned不可,那么继续解释一下:
unsaved-value="none" 的时候,由于不论主键属性为任何值,都不可能为none,因此Hibernate总是对child对象发送update(child)
unsaved-value="any" 的时候,由于不论主键属性为任何值,都肯定为any,因此Hibernate总是对child对象发送save(child)
      大多数情况下,可以避免使用assigned,只有当你使用复合主键的时候不得不手工setId(),这时候需要你自己考虑究竟怎么设置unsaved-value了,根据你自己的需要来定。
      关于为什么不要使主键带有义务意义,robbin的解释很清楚:还是以上面的例子打比方,如果我们将Category的某一个性质(比如产品序号或者名称)作为主键,如果后来由于业务需要,我们把这个性质改了,那将不可僻免地要去修改与这个对象相关联的所有数据的外键,而如果我们只要代理主键,这个问题就可完全僻免。

posted @ 2009-03-30 16:06 张永耀 阅读(313) | 评论 (0)编辑 收藏

今天在写程序的时候发现了一个很奇怪的问题“ResultSet can not re-read row data for column”,用google一搜,原来是微软公司的驱动的兼容性不太好。有热心人总结了微软驱动的缺点:(1)如果采用jdbc-odbc驱动,那么就必须按照查询顺序来一次读取(不论有没有image或text,ntext类型)(2)如果采用微软提供的ms sql server jdbc driver,如果查询语句中,不存在image或text,ntext类型字段,那么可以按照无序获取(3)如果采用微软提供的ms sql server jdbc driver,如果查询语句中,存在image或text,ntext类型字段,那么就必须按照顺序读取,否则就会报告Driver]ResultSet can not re-read row data for column之类的错误(4)如果想不查询语句中有没有image或text,,ntext类型字段,都可以不按照顺序获取,或重复获取。那么就必须更换驱动,改用第三方的。 最后,我改用了第三方的驱动。测试成功。
posted @ 2009-03-27 14:25 张永耀 阅读(306) | 评论 (0)编辑 收藏

用delphi和VB实现浏览器中超长文件的上传
 

摘 要 本文通过delphi的Tihttp控件,将超大文件分割成几个小文件,通过构造的表单数据流,

            直接发送到接收数据网页,由vb编写的服务器端进行文件接收和还原

一、问题的提出:

本单位在开发课件生成系统时,需要通过浏览器向服务器指定目录传送大的音、视频文件。在微软asp中未提供相应的控件,asp.net虽然提供了form表单中的file控件进行文件上传,但对上传的文件有长度限制,文件长度大于50M上传会失败,而微软基于安全考量,file控件中的文件名在运行期间只读,这样利用微软提供的控件向服务器端上传长度超过50M的文件变为不可行,必须另劈蹊径。

二、解决方案

delphi以其强大的控件集,快速的RAD开发,深得程序开发人员的青睐,其最新控件集Indy,集成了大部分流行的Internet协议,包括TCPUDPDNSICMPFINGERFTPGOPHERHTTPPOP3SMTPTELNETWHOIS,而浏览器的传输协议为http。这样我们可以利用delphi7中的TIHTTP控件,将数据打包后上传到服务器端。基本思路为:开发两部分功能程序,一个为ActiveX控件,嵌入到网页中,负责将客户端本地上传文件分解成n个数据包,每个数据包直接编码成“multipart/form-data”格式的表单信息,依次调用TIhttp控件的post方法向服务器端发送信息。另一个为服务器端的com组件,接受发送过来的原始信息,将数据包拼接还原成文件保存到服务器的指定目录中。

三、技术要点:

    1Delyhi 7开发Active X控件要点:选择新建项目→Active x标签→Active Form→填入控件名可快速搭建一个Acfire X控件架构,产生一个表单和一个框架代码文件。

2.上传Active x控件设计要点:①表单控件中放置一个编辑控件、三个命令按钮、一个进度条控件、一个文本标签控件、一个文件对话框控件。编辑控件用来放置上传文件名。一个浏览按钮打开文件选择对话框,选择上传文件;进度条控件显示上传文件进度;文本标签显示上传文件百分比,取消按钮可中断文件上传。

②项目包含两个代码文件,其中一个文件用来将上传文件拆分成小数据包。其关键代码如下:

    for y:=0 to filenum  do

       begin

         if y=0  then   //第一个包

             begin

            if y <> filenum then

                  begin

                      for i:=1 to basenum do

                        begin

                           read(f,ch);

                           tempf:=chr(ch);

                           temp:=temp+tempf;

                          application.ProcessMessages;

                        end;

                    vflag:=postdata(vurl,vfilename,temp,'0');

                    end

                  else

                         begin

                         j:=0;

                            while not eof(f) do

                            begin

                              read(f,ch);

                            tempf:=chr(ch);

                            temp:=temp+tempf;

                            j:=j+1;

                            application.ProcessMessages;

                  vflag:=postdata(vurl,vfilename,temp,'-2');

                end;

               end

               else if y<> filenum then //中间包

                   begin

                      for i:=1 to basenum do

                        begin

                           read(f,ch);

                          tempf:=chr(ch);

                           temp:=temp+tempf;

                            application.ProcessMessages;

                        end;

                          vflag:=postdata(vurl,vfilename,temp,'1');

                  end

               else  //最后一个包

                 begin

                        j:=0;

                        while not eof(f) do

                       begin

                         read(f,ch);

                         tempf:=chr(ch);

                         temp:=temp+tempf;

                         j:=j+1;

                          application.ProcessMessages;

                     end;

                   vflag:=postdata(vurl,vfilename,temp,'-1');

                 end;

       end;

end;

③另一个文件用来将小数据包按照http格式封装成二进制文件上传数据流发送到指定的接收页面(URL),数据流除必要的头信息,包含两个表单城,一个数据块,其中一个表单域用来传递文件标记,用来区分本数据包是第一个包,中间包还是最后一个包,另一个表单域传递上传文件名,其关键代码如下:

   try

     filedata.Seek(0,sofrombeginning);

     tempstring:='';

     tempstring:=tempstring+'------------------------------7cf87224d2020a'+

         newline;

     tempstring:=tempstring+'Content-Disposition: form-data;name="vflag"'+newline;

     tempstring:=tempstring+''+newline;

     tempstring:=tempstring+vflag+newline;

     tempstring:=tempstring+''+newline;

     tempstring:=tempstring+''+newline;

     tempstring:=tempstring+'Content-Disposition: form-data; name="editfilename"; filename="'+infile+'"'+newline;

     tempstring:=tempstring+'Content-Type: application/octet-stream'+newline;

     tempstring:=tempstring+''+newline;

     fillchar(temparray,sizeof(temparray),#0);

     strpcopy(temparray,tempstring);

     request.Write(temparray,length(tempstring));

     request.seek(0,sofromend);

     request.CopyFrom(filedata,filedata.size);

     tempstring:='';

     tempstring:=tempstring+''+newline;

     tempstring:=tempstring+'------------------------------7cf87224d2020a--'

          +newline;

     fillchar(temparray,sizeof(temparray),#0);

     strpcopy(temparray,tempstring);

     request.write(temparray,length(tempstring));

     try

       http.Post(url,request,response);

       if pos('成功',response.datastring)<>0 then

          flag:=1

     end.

End.

④本ActiveX控件特色:可以实时显示上传进度,并能随时中断文件的上传,上传页面画面如图所示,可不能随时中断文件上传,即应用程序能随时从循环语句中跳出,在循环语句中使用了ayydicdition Process Messages语句,该语句用来监听和处理系统消息这样就有效避免了文件上传时,不能进行系统的其它操作。

3.用VB6.0开发服务器端接收文件的Activeex dll,主要利用VB6.0强大的网页操作功能,引用库文件microsoft Active sever Page object library。其中包含有asp对象Asp library request。创建一个接收函数load,使用request对象读取上传给接收页面的二进制数据流,分离出上传标志、上传文件名以及文件内容,根据上传标志将分段传送来的文件内容拼接成一个完整的文件,保存到指定目录。

四、几点说明

    1.本程序在操作系统为Win98 Win2000的客户端机器,IIS服务器端为Win 2000的环境下调试通过;

2.将upfile.htmupload.aspmyget.dllupfileproj1.ocx文件放置到IIS服务之虚拟目录upfile下(缺省目录为C:"Inetpub"unnroot"upfile);

3.修改upfile.htmcodebase属性(缺省为http://11.68.17.80/upfile/upfileproj1.ocx)中的IP地址为服务器端地址;

4.修改delphi工程文件upfileprojl中的upfilelmpl1文件中的Button2 click事件中的vulstring=’http://11.68.17.80/upfile/upload.asp’一行数据,将其中的IP地址转接为服务器端地址,重新编译后将upfrleprojl.ocx放置到虚拟目录下;

5.上传文件在服务器端的默认保存目录为c:"temp;

6.须手工注册myget.dll,命令语句为regsvr32  C:"inetpub"wwwroot"upfile"myget.dll

7.览器中敲击网站地址执行,缺省地址为http://11.68.17.80/upfile/upfile.htm
posted @ 2009-03-27 08:48 张永耀 阅读(486) | 评论 (0)编辑 收藏