2006年1月11日
#
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
?
--=================================================================
-- 描述:~~~~~~~~~~~~~~~~~~~~~~~~~~~
-- 作者:魯湘
-- @tableName?? 該模板對應的數(shù)據(jù)庫表
-- @RecordID??? 業(yè)務處理需要尋找表中記錄的ID號碼
--=================================================================
ALTER??? PROCEDURE WF_QingJia
? ?(@tableName varchar(50),@recordID varchar(50))
AS
-- 獲取表中的業(yè)務數(shù)據(jù)值
DECLARE @money varchar(100),? -- 業(yè)務邏輯需要的值
?@sqls nvarchar(4000)? -- 保存組合SQL語句
SET @sqls='SELECT @a=Money FROM '+@tableName +' WHERE ID ='+@recordID
EXECUTE sp_executesql @sqls,N'@a varchar(50) output',@money output
-- 根據(jù)值進行相應的業(yè)務處理
print @money
UPDATE WF_FormBill SET [Money]='真的被處理了' WHERE [ID]=@recordID
?
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
經(jīng)典SQL語句--收藏
[個人收藏]經(jīng)典SQL語句.值得收藏
精典的SQL語句,推薦收藏
在網(wǎng)上經(jīng)常轉(zhuǎn),常常看到有些人為了求得某些SQL語句而焦頭爛額,現(xiàn)在我特別把自己收藏的一些比較精典的SQL拿出來和大家分享一下
1. 行列轉(zhuǎn)換--普通
假設有張學生成績表(CJ)如下
Name ? Subject ? Result
張三 ? 語文 ? ? 80
張三 ? 數(shù)學 ? ? 90
張三 ? 物理 ? ? 85
李四 ? 語文 ? ? 85
李四 ? 數(shù)學 ? ? 92
李四 ? 物理 ? ? 82
想變成 ?
姓名 ? 語文 ? 數(shù)學 ? 物理
張三 ? 80 ? 90 ? 85
李四 ? 85 ? 92 ? 82
declare @sql varchar(4000)
set @sql = ''select Name''
select @sql = @sql + '',sum(case Subject when ''''''+Subject+'''''' then Result end) [''+Subject+'']''
from (select distinct Subject from CJ) as a
select @sql = @sql+'' from test group by name''
exec(@sql)
2. 行列轉(zhuǎn)換--合并
有表A,
id pid
1 ? 1
1 ? 2
1 ? 3
2 ? 1
2 ? 2
3 ? 1
如何化成表B:
id pid
1 1,2,3
2 1,2
3 1
創(chuàng)建一個合并的函數(shù)
create function fmerg(@id int)
returns varchar(8000)
as
begin
declare @str varchar(8000)
set @str=''''
select @str=@str+'',''+cast(pid as varchar) from 表A where id=@id set @str=right(@str,len(@str)-1)
return(@str)
End
go
--調(diào)用自定義函數(shù)得到結(jié)果
select distinct id,dbo.fmerg(id) from 表A
3. 如何取得一個數(shù)據(jù)表的所有列名
方法如下:先從SYSTEMOBJECT系統(tǒng)表中取得數(shù)據(jù)表的SYSTEMID,然后再SYSCOLUMN表中取得該數(shù)據(jù)表的所有列名。
SQL語句如下:
declare @objid int,@objname char(40)
set @objname = ''tablename''
select @objid = id from sysobjects where id = object_id(@objname)
select ''Column_name'' = name from syscolumns where id = @objid order by colid
是不是太簡單了? 呵呵 不過經(jīng)常用阿.
4. 通過SQL語句來更改用戶的密碼
修改別人的,需要sysadmin role ?
EXEC sp_password NULL, ''newpassword'', ''User''
如果帳號為SA執(zhí)行EXEC sp_password NULL, ''newpassword'', sa
5. 怎么判斷出一個表的哪些字段不允許為空?
select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where IS_NULLABLE=''NO'' and TABLE_NAME=tablename
6. 如何在數(shù)據(jù)庫里找到含有相同字段的表?
a. 查已知列名的情況
SELECT b.name as TableName,a.name as columnname
From syscolumns ? a INNER JOIN ? sysobjects b ?
ON a.id=b.id ?
AND b.type=''U'' ?
AND a.name=''你的字段名字''
b. 未知列名查所有在不同表出現(xiàn)過的列名
Select o.name As tablename,s1.name As columnname
From syscolumns s1, sysobjects o
Where s1.id = o.id
? And o.type = ''U''
? And Exists (
? ? Select 1 From syscolumns s2 ?
? ? Where s1.name = s2.name ?
? ? And s1.id <> s2.id
? ? )
7. 查詢第xxx行數(shù)據(jù)
假設id是主鍵:
select *
from (select top xxx * from yourtable) aa
where not exists(select 1 from (select top xxx-1 * from yourtable) bb where aa.id=bb.id)
如果使用游標也是可以的
fetch absolute [number] from [cursor_name]
行數(shù)為絕對行數(shù)
8. SQL Server日期計算
a. 一個月的第一天
SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)
b. 本周的星期一
SELECT DATEADD(wk, DATEDIFF(wk,0,getdate()), 0)
c. 一年的第一天
SELECT DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)
d. 季度的第一天
SELECT DATEADD(qq, DATEDIFF(qq,0,getdate()), 0)
e. 上個月的最后一天
SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()), 0))
f. 去年的最后一天
SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0))
g. 本月的最后一天
SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0))
h. 本月的第一個星期一
select DATEADD(wk, DATEDIFF(wk,0, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? dateadd(dd,6-datepart(day,getdate()),getdate()) ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ), 0) ? ?
i. 本年的最后一天
SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0))。
-----------------------------------------------------------------------
1.按姓氏筆畫排序:
Select * From TableName Order By CustomerName Collate Chinese_PRC_Stroke_ci_as
2.數(shù)據(jù)庫加密:
select encrypt(''原始密碼'')
select pwdencrypt(''原始密碼'')
select pwdcompare(''原始密碼'',''加密后密碼'') = 1--相同;否則不相同 encrypt(''原始密碼'')
select pwdencrypt(''原始密碼'')
select pwdcompare(''原始密碼'',''加密后密碼'') = 1--相同;否則不相同
3.取回表中字段:
declare @list varchar(1000),@sql nvarchar(1000)
select @list=@list+'',''+b.name from sysobjects a,syscolumns b where a.id=b.id and a.name=''表A''
set @sql=''select ''+right(@list,len(@list)-1)+'' from 表A''
exec (@sql)
4.查看硬盤分區(qū):
EXEC master..xp_fixeddrives
5.比較A,B表是否相等:
if (select checksum_agg(binary_checksum(*)) from A)
? =
? (select checksum_agg(binary_checksum(*)) from B)
print ''相等''
else
print ''不相等''
6.殺掉所有的事件探察器進程:
DECLARE hcforeach CURSOR GLOBAL FOR SELECT ''kill ''+RTRIM(spid) FROM master.dbo.sysprocesses
WHERE program_name IN(''SQL profiler'',N''SQL 事件探查器'')
EXEC sp_msforeach_worker ''?''
7.記錄搜索:
開頭到N條記錄
Select Top N * From 表
-------------------------------
N到M條記錄(要有主索引ID)
Select Top M-N * From 表 Where ID in (Select Top M ID From 表) Order by ID Desc
----------------------------------
N到結(jié)尾記錄
Select Top N * From 表 Order by ID Desc
8.如何修改數(shù)據(jù)庫的名稱:
sp_renamedb ''old_name'', ''new_name''
9:獲取當前數(shù)據(jù)庫中的所有用戶表
select Name from sysobjects where xtype=''u'' and status>=0
10:獲取某一個表的所有字段
select name from syscolumns where id=object_id(''表名'')
11:查看與某一個表相關的視圖、存儲過程、函數(shù)
select a.* from sysobjects a, syscomments b where a.id = b.id and b.text like ''%表名%''
12:查看當前數(shù)據(jù)庫中所有存儲過程
select name as 存儲過程名稱 from sysobjects where xtype=''P''
13:查詢用戶創(chuàng)建的所有數(shù)據(jù)庫
select * from master..sysdatabases D where sid not in(select sid from master..syslogins where name=''sa'')
或者
select dbid, name AS DB_NAME from master..sysdatabases where sid <> 0x01
14:查詢某一個表的字段和數(shù)據(jù)類型
select column_name,data_type from information_schema.columns
where table_name = ''表名''
[n].[標題]:
Select * From TableName Order By CustomerName
[n].[標題]:
Select * From TableName Order By CustomerName
vs2003 和vs2005下的發(fā)送SMTP郵件 (downmoon原創(chuàng))
一、vs2003
引用 System.Web.Mail命名空間
?private void SenMail2003()
??? {
??????? MailMessage mailObj = new MailMessage();
??????? mailObj.To = this.txtTo.Text;
??????? mailObj.From = this.txtFrom.Text;
???????
??????? mailObj.Subject = "精采笑話";
??????? mailObj.Body = "豬!你已中毒! 哈哈 ";
???????
??????? mailObj.BodyFormat = MailFormat.Html;
??????? mailObj.BodyEncoding = MailFormat.Base64;
??????? mailObj.Priority = MailPriority.High;
??????? mailObj.Attachments.Add(new MailAttachment("c:\\swf\\000.bmp"));
??????? SmtpMail.Send(mailObj);
??????? Response.Write("發(fā)送郵件成功!");
??? }
二、vs2005
引用 System.Net.Mail命名空間,安全性得到了增強
?public static void SendWebMailAndAttach(string server)
??? {
???????? string file = "e:\\inetpub\\wwwroot\\Test2005All\\TestXML\\testXML.xml";
???????? System.Net.Mail.MailMessage message = new System.Net.Mail.MailMessage("Test@126.com", "Test@126.com", "text message for you.", "Test Title");
???????? System.Net.Mail.Attachment data = new System.Net.Mail.Attachment(file, System.Net.Mime.MediaTypeNames.Application.Octet);
???????? System.Net.Mime.ContentDisposition disposition = data.ContentDisposition;
???????? disposition.CreationDate = System.IO.File.GetCreationTime(file);
???????? disposition.ModificationDate = System.IO.File.GetLastWriteTime(file);
???????? disposition.ReadDate = System.IO.File.GetLastAccessTime(file);
???????? message.Attachments.Add(data);
??????? System.Net.Mail.SmtpClient client = new System.Net.Mail.SmtpClient(server);
??????? client.Credentials = new NetworkCredential("用戶名", "密碼");
??????? client.Send(message);
??????? data.Dispose();
??? }
引用示例
SendWebMailAndAttach("smtp.126.com");
SQL中CONVERT轉(zhuǎn)化函數(shù)的用法
CONVERT的使用方法:
////////////////////////////////////////////////////////////////////////////////////////
格式:
CONVERT(data_type,expression[,style])
說明:
此樣式一般在時間類型(datetime,smalldatetime)與字符串類型(nchar,nvarchar,char,varchar)
相互轉(zhuǎn)換的時候才用到.
例子:
SELECT CONVERT(varchar(30),getdate(),101) now
結(jié)果為
now
---------------------------------------
09/15/2001
/////////////////////////////////////////////////////////////////////////////////////
style數(shù)字在轉(zhuǎn)換時間時的含義如下
-------------------------------------------------------------------------------------------------
Style(2位表示年份) | Style(4位表示年份) | 輸入輸出格式
-------------------------------------------------------------------------------------------------
- | 0 or 100 | mon dd yyyy hh:miAM(或PM)
-------------------------------------------------------------------------------------------------
1 | 101 | mm/dd/yy
-------------------------------------------------------------------------------------------------
2 | 102 | yy-mm-dd
-------------------------------------------------------------------------------------------------
3 | 103 | dd/mm/yy
-------------------------------------------------------------------------------------------------
4 | 104 | dd-mm-yy
-------------------------------------------------------------------------------------------------
5 | 105 | dd-mm-yy
-------------------------------------------------------------------------------------------------
6 | 106 | dd mon yy
-------------------------------------------------------------------------------------------------
7 | 107 | mon dd,yy
-------------------------------------------------------------------------------------------------
8 | 108 | hh:mm:ss
-------------------------------------------------------------------------------------------------
- | 9 or 109 | mon dd yyyy hh:mi:ss:mmmmAM(或PM)
-------------------------------------------------------------------------------------------------
10 | 110 | mm-dd-yy
-------------------------------------------------------------------------------------------------
11 | 111 | yy/mm/dd
-------------------------------------------------------------------------------------------------
12 | 112 | yymmdd
-------------------------------------------------------------------------------------------------
- | 13 or 113 | dd mon yyyy hh:mi:ss:mmm(24小時制)
-------------------------------------------------------------------------------------------------
14 | 114 | hh:mi:ss:mmm(24小時制)
-------------------------------------------------------------------------------------------------
- | 20 or 120 | yyyy-mm-dd hh:mi:ss(24小時制)
-------------------------------------------------------------------------------------------------
- | 21 or 121 | yyyy-mm-dd hh:mi:ss:mmm(24小時制)
-------------------------------------------------------------------------------------------------
concat方法的結(jié)果等于:result = string1 + string2 + string3 + … + stringN
1.C#連接連接Access
程序代碼:
-------------------------------------------------------------------------------using System.Data;
using System.Data.OleDb;
......
string strConnection="Provider=Microsoft.Jet.OleDb.4.0;";
strConnection+=@"Data Source=C:\BegASPNET\Northwind.mdb";
OleDbConnection objConnection=new OleDbConnection(strConnection);
......
objConnection.Open();
objConnection.Close();
......
--------------------------------------------------------------------------------
解釋:
連接Access數(shù)據(jù)庫需要導入額外的命名空間,所以有了最前面的兩條using命令,這是必不可少的!
strConnection這個變量里存放的是連接數(shù)據(jù)庫所需要的連接字符串,他指定了要使用的數(shù)據(jù)提供者和要使用的數(shù)據(jù)源.
"Provider=Microsoft.Jet.OleDb.4.0;"是指數(shù)據(jù)提供者,這里使用的是Microsoft Jet引擎,也就是Access中的數(shù)據(jù)引擎,asp.net就是靠這個和Access的數(shù)據(jù)庫連接的.
"Data Source=C:\BegASPNET\Northwind.mdb"是指明數(shù)據(jù)源的位置,他的標準形式是"Data Source=MyDrive:MyPath\MyFile.MDB".
PS:
1."+="后面的"@"符號是防止將后面字符串中的"\"解析為轉(zhuǎn)義字符.
2.如果要連接的數(shù)據(jù)庫文件和當前文件在同一個目錄下,還可以使用如下的方法連接:
strConnection+="Data Source=";
strConnection+=MapPath("Northwind.mdb");
這樣就可以省得你寫一大堆東西了!
3.要注意連接字符串中的參數(shù)之間要用分號來分隔.
"OleDbConnection objConnection=new OleDbConnection(strConnection);"這一句是利用定義好的連接字符串來建立了一個鏈接對象,以后對數(shù)據(jù)庫的操作我們都要和這個對象打交道.
"objConnection.Open();"這用來打開連接.至此,與Access數(shù)據(jù)庫的連接完成.
--------------------------------------------------------------------------------
2.C#連接SQL Server
程序代碼:
--------------------------------------------------------------------------------
using System.Data;
using System.Data.SqlClient;
...
string strConnection="user id=sa;password=;";
strConnection+="initial catalog=Northwind;Server=YourSQLServer;";
strConnection+="Connect Timeout=30";
SqlConnection objConnection=new SqlConnection(strConnection);
...
objConnection.Open();
objConnection.Close();
...
--------------------------------------------------------------------------------
解釋:
連接SQL Server數(shù)據(jù)庫的機制與連接Access的機制沒有什么太大的區(qū)別,只是改變了Connection對象和連接字符串中的不同參數(shù).
首先,連接SQL Server使用的命名空間不是"System.Data.OleDb",而是"System.Data.SqlClient".
其次就是他的連接字符串了,我們一個一個參數(shù)來介紹(注意:參數(shù)間用分號分隔):
"user id=sa":連接數(shù)據(jù)庫的驗證用戶名為sa.他還有一個別名"uid",所以這句我們還可以寫成"uid=sa".
"password=":連接數(shù)據(jù)庫的驗證密碼為空.他的別名為"pwd",所以我們可以寫為"pwd=".
這里注意,你的SQL Server必須已經(jīng)設置了需要用戶名和密碼來登錄,否則不能用這樣的方式來登錄.如果你的SQL Server設置為Windows登錄,那么在這里就不需要使用"user id"和"password"這樣的方式來登錄,而需要使用"Trusted_Connection=SSPI"來進行登錄.
"initial catalog=Northwind":使用的數(shù)據(jù)源為"Northwind"這個數(shù)據(jù)庫.他的別名為"Database",本句可以寫成"Database=Northwind".
"Server=YourSQLServer":使用名為"YourSQLServer"的服務器.他的別名為"Data Source","Address","Addr".如果使用的是本地數(shù)據(jù)庫且定義了實例名,則可以寫為"Server=(local)\實例名";如果是遠程服務器,則將"(local)"替換為遠程服務器的名稱或IP地址.
"Connect Timeout=30":連接超時時間為30秒.
在這里,建立連接對象用的構(gòu)造函數(shù)為:SqlConnection.
--------------------------------------------------------------------------------
3.C#連接Oracle
程序代碼:
--------------------------------------------------------------------------------
using System.Data.OracleClient;
using System.Data;
//在窗體上添加一個按鈕,叫Button1,雙擊Button1,輸入以下代碼
private void Button1_Click(object sender, System.EventArgs e)
{
string ConnectionString="Data Source=sky;user=system;password=manager;";//寫連接串
OracleConnection conn=new OracleConnection(ConnectionString);//創(chuàng)建一個新連接
try
{
conn.Open();
OracleCommand cmd=conn.CreateCommand();
cmd.CommandText="select * from MyTable";//在這兒寫sql語句
OracleDataReader odr=cmd.ExecuteReader();//創(chuàng)建一個OracleDateReader對象
while(odr.Read())//讀取數(shù)據(jù),如果odr.Read()返回為false的話,就說明到記錄集的尾部了???????????????
{
Response.Write(odr.GetOracleString(1).ToString());//輸出字段1,這個數(shù)是字段索引,具體怎么使用字段名還有待研究
}
odr.Close();
}
catch(Exception ee)
{
Response.Write(ee.Message); //如果有錯誤,輸出錯誤信息
}
finally
{
conn.Close(); //關閉連接
}
}
--------------------------------------------------------------------------------
4.C#連接MySQL
程序代碼:
--------------------------------------------------------------------------------
using MySQLDriverCS;
// 建立數(shù)據(jù)庫連接
MySQLConnection DBConn;
DBConn = new MySQLConnection(new MySQLConnectionString("localhost","mysql","root","",3306).AsString);
DBConn.Open();
// 執(zhí)行查詢語句
MySQLCommand DBComm;
DBComm = new MySQLCommand("select Host,User from user",DBConn);
// 讀取數(shù)據(jù)
MySQLDataReader DBReader = DBComm.ExecuteReaderEx();
// 顯示數(shù)據(jù)
try
{
while (DBReader.Read())
{
Console.WriteLine("Host = {0} and User = {1}", DBReader.GetString(0),DBReader.GetString(1));
}
}
finally
{
DBReader.Close();
DBConn.Close();
}
//關閉數(shù)據(jù)庫連接
DBConn.Close();
--------------------------------------------------------------------------------
5.C#連接IBM DB2
程序代碼:
--------------------------------------------------------------------------------
OleDbConnection1.Open();
//打開數(shù)據(jù)庫連接
OleDbDataAdapter1.Fill(dataSet1,"Address");
//將得來的數(shù)據(jù)填入dataSet
DataGrid1.DataBind();
//綁定數(shù)據(jù)
OleDbConnection1.Close();
//關閉連接
//增加數(shù)據(jù)庫數(shù)據(jù)
在Web Form上新增對應字段數(shù)量個數(shù)的TextBox,及一個button,為該按鍵增加Click響應事件代碼如下:
this.OleDbInsertCommand1.CommandText = "INSERTsintosADDRESS(NAME,
EMAIL, AGE, ADDRESS) VALUES
('"+TextBox1.Text+"','"+TextBox2.Text+"','"+TextBox3.Text+"','"+TextBox4.Text+"')";
OleDbInsertCommand1.Connection.Open();
//打開連接
OleDbInsertCommand1.ExecuteNonQuery();
//執(zhí)行該SQL語句
OleDbInsertCommand1.Connection.Close();
//關閉連接
--------------------------------------------------------------------------------
6.C#連接SyBase
程序代碼: (OleDb)
--------------------------------------------------------------------------------
Provider=Sybase.ASEOLEDBProvider.2;Initial Catalog=數(shù)據(jù)庫名;User ID=用戶名;Data Source=數(shù)據(jù)源;Extended Properties="";Server Name=ip地址;Network Protocol=Winsock;Server Port Address=5000;
分布式查詢
??? OPENROWSET
??? 從Excel取數(shù)據(jù)
??? SELECT * FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0','Excel 8.0;Database=d:\1.xls',[Sheet1$])
??? 從Oracle取數(shù)據(jù)
??? SELECT?* FROM OPENROWSET('MSDAORA.1','NetServiceName';'User';'Password','SELECT * FROM OracleTalbe')
?
??? Linked Server(for Oracle)
??? 建立Linked Server
??? sp_addlinkedserver'Allies', 'Oracle', 'MSDAORA.1', 'NetServiceName'
??? Oracle的Login
??? sp_addlinkedsrvlogin'Allies', FALSE, 'SQLServerLogin', 'OracleUser', 'OraclePassword'
??? 從Oracle查詢數(shù)據(jù)
??? SELECT*FROM OPENQUERY( Allies, 'SELECT * FROM OracleTalbe'),或者
??? SELECT*FROM
Allies..OracleUser.OracleTalbe
??? 修改Linked Server的Server Option
?
?? sp_serveroption'Allies', 'Option Name',
'Option Value'
??? 例如
??? sp_serveroption'OraDC', 'rpc out', 'true'
??? sp_serveroption'OraDC', 'rpc', 'true'
??? 向Oracle插入數(shù)據(jù)(還沒有用過)
??? INSERT INTO OPENQUERY(Allies, 'SELECT ... FROM OracleTalbe WHERE 1=2') VALUES ( ... )
??? 刪除Linked Server
??? sp_dropserver'Allies', 'droplogins'
?
??? 注意:使用OPENROWSET、OPENQUERY時,SQL Server不對提交的SQL語句做任何檢查,直接將語句提交給Linked Server進行處理;使用四部分命名法時,SQL Server可能從Linked Server上讀取被引用表的數(shù)據(jù)到SQL Server,然后在SQL Server上來完成其它操作。
?
??? 設置SQL Server到Oracle的Linked Server,可參考以下KB文章:
?
??? 分布式事務中的OPENROWSET、OPENQUERY、OPENDATASOURCE
??? 如果在事務,或是一些隱含使用事務的情況下,例如TRIGGER中,使用OPENROWSET、OPENQUERY、OPENDATASOURCE時,就需要使用分布式事務來處理。
??? 在分布式事務中使用OPENROWSET、OPENQUERY、OPENDATASOURCE或Linked Server時,需要注意:
??? 1. 必須啟動MSDTC服務。
????Service Name為Distributed Transaction Coodinator。
??? 2. 所涉及的Server之間如果存在網(wǎng)關、防火墻,需要開啟TCP 135端口。
??? 分布式事務需要使用這個端口通訊。
??? 3. 如果Server之間跨網(wǎng)段,則Server之間需要能互相PING到機器名(而不是IP地址)。
??? 如果相互PING機器名有問題,修改system32/driver/etc目錄下的hosts文件。
?
??? 上面的設置不正確時,會出現(xiàn)類似如下的錯誤:
??? 該操作未能執(zhí)行,因為 OLE DB 提供程序 'SQLOLEDB' 無法啟動分布式事務。
[OLE/DB provider returned message: 新事務不能登記到指定的事務處理器中。 ]
OLE DB 錯誤跟蹤[OLE/DB Provider 'SQLOLEDB' ITransactionJoin::JoinTransaction returned 0x8004d00a]。
?
?
??? 分布式事務可以查詢下列KB文章:
?
[原創(chuàng)文章,轉(zhuǎn)載請保留或注明出處:http://www.regexlab.com/zh/regref.htm]
引言
正則表達式(regular expression)描述了一種字符串匹配的模式,可以用來:(1)檢查一個串中是否含有符合某個規(guī)則的子串,并且可以得到這個子串;(2)根據(jù)匹配規(guī)則對字符串進行靈活的替換操作。
正則表達式學習起來其實是很簡單的,不多的幾個較為抽象的概念也很容易理解。之所以很多人感覺正則表達式比較復雜,一方面是因為大多數(shù)的文檔沒有做到由淺入深地講解,概念上沒有注意先后順序,給讀者的理解帶來困難;另一方面,各種引擎自帶的文檔一般都要介紹它特有的功能,然而這部分特有的功能并不是我們首先要理解的。
文章中的每一個舉例,都可以點擊進入到測試頁面進行測試。閑話少說,開始。
1. 正則表達式規(guī)則
1.1 普通字符
字母、數(shù)字、漢字、下劃線、以及后邊章節(jié)中沒有特殊定義的標點符號,都是"普通字符"。表達式中的普通字符,在匹配一個字符串的時候,匹配與之相同的一個字符。
,匹配結(jié)果是:成功;匹配到的內(nèi)容是:"c";匹配到的位置是:開始于2,結(jié)束于3。(注:下標從0開始還是從1開始,因當前編程語言的不同而可能不同)
,匹配結(jié)果是:成功;匹配到的內(nèi)容是:"bcd";匹配到的位置是:開始于1,結(jié)束于4。
1.2 簡單的轉(zhuǎn)義字符
一些不便書寫的字符,采用在前面加 "\" 的方法。這些字符其實我們都已經(jīng)熟知了。
表達式 |
可匹配 |
\r, \n |
代表回車和換行符 |
\t |
制表符 |
\\ |
代表 "\" 本身 |
還有其他一些在后邊章節(jié)中有特殊用處的標點符號,在前面加 "\" 后,就代表該符號本身。比如:^, $ 都有特殊意義,如果要想匹配字符串中 "^" 和 "$" 字符,則表達式就需要寫成 "\^" 和 "\$"。
表達式 |
可匹配 |
\^ |
匹配 ^ 符號本身 |
\$ |
匹配 $ 符號本身 |
\. |
匹配小數(shù)點(.)本身 |
這些轉(zhuǎn)義字符的匹配方法與 "普通字符" 是類似的。也是匹配與之相同的一個字符。
,匹配結(jié)果是:成功;匹配到的內(nèi)容是:"$d";匹配到的位置是:開始于3,結(jié)束于5。
1.3 能夠與 '多種字符' 匹配的表達式
正則表達式中的一些表示方法,可以匹配 '多種字符' 其中的任意一個字符。比如,表達式 "\d" 可以匹配任意一個數(shù)字。雖然可以匹配其中任意字符,但是只能是一個,不是多個。這就好比玩撲克牌時候,大小王可以代替任意一張牌,但是只能代替一張牌。
表達式 |
可匹配 |
\d |
任意一個數(shù)字,0~9 中的任意一個 |
\w |
任意一個字母或數(shù)字或下劃線,也就是 A~Z,a~z,0~9,_ 中任意一個 |
\s |
包括空格、制表符、換頁符等空白字符的其中任意一個 |
. |
小數(shù)點可以匹配除了換行符(\n)以外的任意一個字符 |
,匹配的結(jié)果是:成功;匹配到的內(nèi)容是:"12";匹配到的位置是:開始于3,結(jié)束于5。
,匹配的結(jié)果是:成功;匹配到的內(nèi)容是:"aa1";匹配到的位置是:開始于1,結(jié)束于4。
1.4 自定義能夠匹配 '多種字符' 的表達式
使用方括號 [ ] 包含一系列字符,能夠匹配其中任意一個字符。用 [^ ] 包含一系列字符,則能夠匹配其中字符之外的任意一個字符。同樣的道理,雖然可以匹配其中任意一個,但是只能是一個,不是多個。
表達式 |
可匹配 |
[ab5@] |
匹配 "a" 或 "b" 或 "5" 或 "@" |
[^abc] |
匹配 "a","b","c" 之外的任意一個字符 |
[f-k] |
匹配 "f"~"k" 之間的任意一個字母 |
[^A-F0-3] |
匹配 "A"~"F","0"~"3" 之外的任意一個字符 |
,匹配的結(jié)果是:成功;匹配到的內(nèi)容是:"bc";匹配到的位置是:開始于1,結(jié)束于3。
,匹配的結(jié)果是:成功;匹配到的內(nèi)容是:"1";匹配到的位置是:開始于3,結(jié)束于4。
1.5 修飾匹配次數(shù)的特殊符號
前面章節(jié)中講到的表達式,無論是只能匹配一種字符的表達式,還是可以匹配多種字符其中任意一個的表達式,都只能匹配一次。如果使用表達式再加上修飾匹配次數(shù)的特殊符號,那么不用重復書寫表達式就可以重復匹配。
使用方法是:"次數(shù)修飾"放在"被修飾的表達式"后邊。比如:"[bcd][bcd]" 可以寫成 "[bcd]{2}"。
表達式 |
作用 |
{n} |
表達式重復n次,比如:; |
{m,n} |
表達式至少重復m次,最多重復n次,比如: |
{m,} |
表達式至少重復m次,比如: |
? |
匹配表達式0次或者1次,相當于 {0,1},比如: |
+ |
表達式至少出現(xiàn)1次,相當于 {1,},比如: |
* |
表達式不出現(xiàn)或出現(xiàn)任意次,相當于 {0,},比如: |
,匹配的結(jié)果是:成功;匹配到的內(nèi)容是:"12.5";匹配到的位置是:開始于10,結(jié)束于14。
,匹配的結(jié)果是:成功;匹配到的內(nèi)容是:"goooooogle";匹配到的位置是:開始于7,結(jié)束于17。
1.6 其他一些代表抽象意義的特殊符號
一些符號在表達式中代表抽象的特殊意義:
表達式 |
作用 |
^ |
與字符串開始的地方匹配,不匹配任何字符 |
$ |
與字符串結(jié)束的地方匹配,不匹配任何字符 |
\b |
匹配一個單詞邊界,也就是單詞和空格之間的位置,不匹配任何字符 |
進一步的文字說明仍然比較抽象,因此,舉例幫助大家理解。
,匹配結(jié)果是:失敗。因為 "^" 要求與字符串開始的地方匹配,因此,只有當 "aaa" 位于字符串的開頭的時候,"^aaa" 才能匹配,。
,匹配結(jié)果是:失敗。因為 "$" 要求與字符串結(jié)束的地方匹配,因此,只有當 "aaa" 位于字符串的結(jié)尾的時候,"aaa$" 才能匹配,。
,匹配結(jié)果是:成功;匹配到的內(nèi)容是:"@a";匹配到的位置是:開始于2,結(jié)束于4。
進一步說明:"\b" 與 "^" 和 "$" 類似,本身不匹配任何字符,但是它要求它在匹配結(jié)果中所處位置的左右兩邊,其中一邊是 "\w" 范圍,另一邊是 非"\w" 的范圍。
,匹配結(jié)果是:成功;匹配到的內(nèi)容是:"end";匹配到的位置是:開始于15,結(jié)束于18。
一些符號可以影響表達式內(nèi)部的子表達式之間的關系:
表達式 |
作用 |
| |
左右兩邊表達式之間 "或" 關系,匹配左邊或者右邊 |
( ) |
(1). 在被修飾匹配次數(shù)的時候,括號中的表達式可以作為整體被修飾 (2). 取匹配結(jié)果的時候,括號中的表達式匹配到的內(nèi)容可以被單獨得到 |
,匹配結(jié)果是:成功;匹配到的內(nèi)容是:"Tom";匹配到的位置是:開始于4,結(jié)束于7。匹配下一個時,匹配結(jié)果是:成功;匹配到的內(nèi)容是:"Jack";匹配到的位置時:開始于15,結(jié)束于19。
,匹配結(jié)果是:成功;匹配到內(nèi)容是:"go go go";匹配到的位置是:開始于6,結(jié)束于14。
,匹配的結(jié)果是:成功;匹配到的內(nèi)容是:"¥20.5";匹配到的位置是:開始于6,結(jié)束于10。單獨獲取括號范圍匹配到的內(nèi)容是:"20.5"。
2. 正則表達式中的一些高級規(guī)則
2.1 匹配次數(shù)中的貪婪與非貪婪
在使用修飾匹配次數(shù)的特殊符號時,有幾種表示方法可以使同一個表達式能夠匹配不同的次數(shù),比如:"{m,n}", "{m,}", "?", "*", "+",具體匹配的次數(shù)隨被匹配的字符串而定。這種重復匹配不定次數(shù)的表達式在匹配過程中,總是盡可能多的匹配。比如,針對文本 "dxxxdxxxd",舉例如下:
表達式 |
匹配結(jié)果 |
(d)(\w+) |
"\w+" 將匹配第一個 "d" 之后的所有字符 "xxxdxxxd" |
(d)(\w+)(d) |
"\w+" 將匹配第一個 "d" 和最后一個 "d" 之間的所有字符 "xxxdxxx"。雖然 "\w+" 也能夠匹配上最后一個 "d",但是為了使整個表達式匹配成功,"\w+" 可以 "讓出" 它本來能夠匹配的最后一個 "d" |
由此可見,"\w+" 在匹配的時候,總是盡可能多的匹配符合它規(guī)則的字符。雖然第二個舉例中,它沒有匹配最后一個 "d",但那也是為了讓整個表達式能夠匹配成功。同理,帶 "*" 和 "{m,n}" 的表達式都是盡可能地多匹配,帶 "?" 的表達式在可匹配可不匹配的時候,也是盡可能的 "要匹配"。這 種匹配原則就叫作 "貪婪" 模式 。
非貪婪模式:
在修飾匹配次數(shù)的特殊符號后再加上一個 "?" 號,則可以使匹配次數(shù)不定的表達式盡可能少的匹配,使可匹配可不匹配的表達式,盡可能的 "不匹配"。這種匹配原則叫作 "非貪婪" 模式,也叫作 "勉強" 模式。如果少匹配就會導致整個表達式匹配失敗的時候,與貪婪模式類似,非貪婪模式會最小限度的再匹配一些,以使整個表達式匹配成功。舉例如下,針對文本 "dxxxdxxxd" 舉例:
表達式 |
匹配結(jié)果 |
(d)(\w+?) |
"\w+?" 將盡可能少的匹配第一個 "d" 之后的字符,結(jié)果是:"\w+?" 只匹配了一個 "x" |
(d)(\w+?)(d) |
為了讓整個表達式匹配成功,"\w+?" 不得不匹配 "xxx" 才可以讓后邊的 "d" 匹配,從而使整個表達式匹配成功。因此,結(jié)果是:"\w+?" 匹配 "xxx" |
更多的情況,舉例如下:
,匹配的結(jié)果是:成功;匹配到的內(nèi)容是 "<td><p>aa</p></td> <td><p>bb</p></td>" 整個字符串, 表達式中的 "</td>" 將與字符串中最后一個 "</td>" 匹配。
,將只得到 "<td><p>aa</p></td>", 再次匹配下一個時,可以得到第二個 "<td><p>bb</p></td>"。
2.2 反向引用 \1, \2...
表達式在匹配時,表達式引擎會將小括號 "( )" 包含的表達式所匹配到的字符串記錄下來。在獲取匹配結(jié)果的時候,小括號包含的表達式所匹配到的字符串可以單獨獲取。這一點,在前面的舉例中,已經(jīng)多次展示了。在實際應用場合中,當用某種邊界來查找,而所要獲取的內(nèi)容又不包含邊界時,必須使用小括號來指定所要的范圍。比如前面的 "<td>(.*?)</td>"。
其實,"小括號包含的表達式所匹配到的字符串" 不僅是在匹配結(jié)束后才可以使用,在匹配過程中也可以使用。表達式后邊的部分,可以引用前面 "括號內(nèi)的子匹配已經(jīng)匹配到的字符串"。引用方法是 "\" 加上一個數(shù)字。"\1" 引用第1對括號內(nèi)匹配到的字符串,"\2" 引用第2對括號內(nèi)匹配到的字符串……以此類推,如果一對括號內(nèi)包含另一對括號,則外層的括號先排序號。換句話說,哪一對的左括號 "(" 在前,那這一對就先排序號。
舉例如下:
,匹配結(jié)果是:成功;匹配到的內(nèi)容是:" 'Hello' "。再次匹配下一個時,可以匹配到 " "World" "。
,匹配結(jié)果是:成功;匹配到的內(nèi)容是 "ccccc"。再次匹配下一個時,將得到 999999999。這個表達式要求 "\w" 范圍的字符至少重復5次,。
,匹配結(jié)果是成功。如果 "<td>" 與 "</td>" 不配對,則會匹配失敗;如果改成其他配對,也可以匹配成功。
2.3 預搜索,不匹配;反向預搜索,不匹配
前面的章節(jié)中,我講到了幾個代表抽象意義的特殊符號:"^","$","\b"。它們都有一個共同點,那就是:它們本身不匹配任何字符,只是對 "字符串的兩頭" 或者 "字符之間的縫隙" 附加了一個條件。理解到這個概念以后,本節(jié)將繼續(xù)介紹另外一種對 "兩頭" 或者 "縫隙" 附加條件的,更加靈活的表示方法。
正向預搜索:"(?=xxxxx)","(?!xxxxx)"
格式:"(?=xxxxx)",在被匹配的字符串中,它對所處的 "縫隙" 或者 "兩頭" 附加的條件是:所在縫隙的右側(cè),必須能夠匹配上 xxxxx 這部分的表達式。因為它只是在此作為這個縫隙上附加的條件,所以它并不影響后邊的表達式去真正匹配這個縫隙之后的字符。這就類似 "\b",本身不匹配任何字符。"\b" 只是將所在縫隙之前、之后的字符取來進行了一下判斷,不會影響后邊的表達式來真正的匹配。
,將只匹配 "Windows NT" 中的 "Windows ",其他的 "Windows " 字樣則不被匹配。
,將可以匹配6個"f"的前4個,可以匹配9個"9"的前7個。這個表達式可以讀解成:重復4次以上的字母數(shù)字,則匹配其剩下最后2位之前的部分。當然,這個表達式可以不這樣寫,在此的目的是作為演示之用。
格式:"(?!xxxxx)",所在縫隙的右側(cè),必須不能匹配 xxxxx 這部分表達式。
,將從頭一直匹配到 "stop" 之前的位置,如果字符串中沒有 "stop",則匹配整個字符串。
,只能匹配 "do"。在本條舉例中,"do" 后邊使用 "(?!\w)" 和使用 "\b" 效果是一樣的。
反向預搜索:"(?<=xxxxx)","(?<!xxxxx)"
這兩種格式的概念和正向預搜索是類似的,反向預搜索要求的條件是:所在縫隙的 "左側(cè)",兩種格式分別要求必須能夠匹配和必須不能夠匹配指定表達式,而不是去判斷右側(cè)。與 "正向預搜索" 一樣的是:它們都是對所在縫隙的一種附加條件,本身都不匹配任何字符。
舉例5:表達式 "(?<=\d{4})\d+(?=\d{4})" 在匹配 "1234567890123456" 時,將匹配除了前4個數(shù)字和后4個數(shù)字之外的中間8個數(shù)字。由于 JScript.RegExp 不支持反向預搜索,因此,本條舉例不能夠進行演示。很多其他的引擎可以支持反向預搜索,比如:Java 1.4 以上的 java.util.regex 包,.NET 中System.Text.RegularExpressions 命名空間,boost::regex 以及 GRETA 正則表達式庫等。
3. 其他通用規(guī)則
還有一些在各個正則表達式引擎之間比較通用的規(guī)則,在前面的講解過程中沒有提到。
3.1 表達式中,可以使用 "\xXX" 和 "\uXXXX" 表示一個字符("X" 表示一個十六進制數(shù))
形式 |
字符范圍 |
\xXX |
編號在 0 ~ 255 范圍的字符,比如: |
\uXXXX |
任何字符可以使用 "\u" 再加上其編號的4位十六進制數(shù)表示,比如: |
3.2 在表達式 "\s","\d","\w","\b" 表示特殊意義的同時,對應的大寫字母表示相反的意義
3.3 在表達式中有特殊意義,需要添加 "\" 才能匹配該字符本身的字符匯總
字符 |
說明 |
^ |
匹配輸入字符串的開始位置。要匹配 "^" 字符本身,請使用 "\^" |
$ |
匹配輸入字符串的結(jié)尾位置。要匹配 "$" 字符本身,請使用 "\$" |
( ) |
標記一個子表達式的開始和結(jié)束位置。要匹配小括號,請使用 "\(" 和 "\)" |
[ ] |
用來自定義能夠匹配 '多種字符' 的表達式。要匹配中括號,請使用 "\[" 和 "\]" |
{ } |
修飾匹配次數(shù)的符號。要匹配大括號,請使用 "\{" 和 "\}" |
. |
匹配除了換行符(\n)以外的任意一個字符。要匹配小數(shù)點本身,請使用 "\." |
? |
修飾匹配次數(shù)為 0 次或 1 次。要匹配 "?" 字符本身,請使用 "\?" |
+ |
修飾匹配次數(shù)為至少 1 次。要匹配 "+" 字符本身,請使用 "\+" |
* |
修飾匹配次數(shù)為 0 次或任意次。要匹配 "*" 字符本身,請使用 "\*" |
| |
左右兩邊表達式之間 "或" 關系。匹配 "|" 本身,請使用 "\|" |
3.4 括號 "( )" 內(nèi)的子表達式,如果希望匹配結(jié)果不進行記錄供以后使用,可以使用 "(?:xxxxx)" 格式
舉例1:表達式 "(?:(\w)\1)+" 匹配 "a bbccdd efg" 時,結(jié)果是 "bbccdd"。括號 "(?:)" 范圍的匹配結(jié)果不進行記錄,因此 "(\w)" 使用 "\1" 來引用。
3.5 常用的表達式屬性設置簡介:Ignorecase,Singleline,Multiline,Global
表達式屬性 |
說明 |
Ignorecase |
默認情況下,表達式中的字母是要區(qū)分大小寫的。配置為 Ignorecase 可使匹配時不區(qū)分大小寫。有的表達式引擎,把 "大小寫" 概念延伸至 UNICODE 范圍的大小寫。 |
Singleline |
默認情況下,小數(shù)點 "." 匹配除了換行符(\n)以外的字符。配置為 Singleline 可使小數(shù)點可匹配包括換行符在內(nèi)的所有字符。 |
Multiline |
默認情況下,表達式 "^" 和 "$" 只匹配字符串的開始 ① 和結(jié)尾 ④ 位置。如:
①xxxxxxxxx②\n ③xxxxxxxxx④
配置為 Multiline 可以使 "^" 還可以匹配換行符之后,下一行開始前 ③ 的位置,使 "$" 還可以匹配換行符之前,一行結(jié)束 ② 的位置。 |
Global |
主要在將表達式用來替換時起作用,配置為 Global 表示替換所有的匹配。 |
4. 綜合提示
4.1 如果要要求表達式所匹配的內(nèi)容是整個字符串,而不是從字符串中找一部分,那么可以在表達式的首尾使用 "^" 和 "$",比如:"^\d+$" 要求整個字符串只有數(shù)字。
4.2 如果要求匹配的內(nèi)容是一個完整的單詞,而不會是單詞的一部分,那么在表達式首尾使用 "\b",比如:。
4.3 表達式不要匹配空字符串。否則會一直得到匹配成功,而結(jié)果什么都沒有匹配到。比如:準備寫一個匹配 "123"、"123."、"123.5"、".5" 這幾種形式的表達式時,整數(shù)、小數(shù)點、小數(shù)數(shù)字都可以省略,但是不要將表達式寫成:"\d*\.?\d*",因為如果什么都沒有,這個表達式也可以匹配成功。。
4.4 能匹配空字符串的子匹配不要循環(huán)無限次。如果括號內(nèi)的子表達式中的每一部分都可以匹配 0 次,而這個括號整體又可以匹配無限次,那么情況可能比上一條所說的更嚴重,匹配過程中可能死循環(huán)。雖然現(xiàn)在有些正則表達式引擎已經(jīng)通過辦法避免了這種情況出現(xiàn)死循環(huán)了,比如 .NET 的正則表達式,但是我們?nèi)匀粦摫M量避免出現(xiàn)這種情況。如果我們在寫表達式時遇到了死循環(huán),也可以從這一點入手,查找一下是否是本條所說的原因。
4.5 合理選擇貪婪模式與非貪婪模式。
4.6 或 "|" 的左右兩邊,對某個字符最好只有一邊可以匹配,這樣,不會因為 "|" 兩邊的表達式因為交換位置而有所不同。
5. 搜索更多正則表達式支持
在以下搜索字段中輸入關鍵字,查找問題的答案。
一、從DLL技術(shù)說起
要了解DLL木馬,就必須知道這個“DLL”是什么意思,所以,讓我們追溯到幾年前,DOS系統(tǒng)大行其道的日子里。在那時候,寫程序是一件繁瑣的事情,因為每個程序的代碼都是獨立的,有時候為了實現(xiàn)一個功能,就要為此寫很多代碼,后來隨著編程技術(shù)發(fā)展,程序員們把很多常用的代碼集合(通用代碼)放進一個獨立的文件里,并把這個文件稱為“庫”(Library),在寫程序的時候,把這個庫文件加入編譯器,就能使用這個庫包含的所有功能而不必自己再去寫一大堆代碼,這個技術(shù)被稱為“靜態(tài)鏈接”(Static Link)。靜態(tài)鏈接技術(shù)讓勞累的程序員松了口氣,一切似乎都很美好。可是事實證明,美好的事物不會存在太久,因為靜態(tài)鏈接就像一個粗魯?shù)耐其N員,不管你想不想要宣傳單,他都全部塞到你的手上來。寫一個程序只想用到一個庫文件包含的某個圖形效果,就因為這個,你不得不把這個庫文件攜帶的所有的圖形效果都加入程序,留著它們當花瓶擺設,這倒沒什么重要,可是這些花瓶卻把道路都阻塞了——靜態(tài)鏈接技術(shù)讓最終的程序成了大塊頭,因為編譯器把整個庫文件也算進去了。
時代在發(fā)展,靜態(tài)鏈接技術(shù)由于天生的弊端,不能滿足程序員的愿望,人們開始尋找一種更好的方法來解決代碼重復的難題。后來,Windows系統(tǒng)出現(xiàn)了,時代的分水嶺終于出現(xiàn)。Windows系統(tǒng)使用一種新的鏈接技術(shù),這種被稱為“動態(tài)鏈接”(Dynamic Link)的新技術(shù)同樣也是使用庫文件,微軟稱它們?yōu)?/SPAN>“動態(tài)鏈接庫”——Dynamic Link Library,DLL的名字就是這樣來的。動態(tài)鏈接本身和靜態(tài)鏈接沒什么區(qū)別,也是把通用代碼寫進一些獨立文件里,但是在編譯方面,微軟繞了個圈子,并沒有采取把庫文件加進程序的方法,而是把庫文件做成已經(jīng)編譯好的程序文件,給它們開個交換數(shù)據(jù)的接口,程序員寫程序的時候,一旦要使用某個庫文件的一個功能函數(shù),系統(tǒng)就把這個庫文件調(diào)入內(nèi)存,連接上這個程序占有的任務進程,然后執(zhí)行程序要用的功能函數(shù),并把結(jié)果返回給程序顯示出來,在我們看來,就像是程序自己帶有的功能一樣。完成需要的功能后,這個DLL停止運行,整個調(diào)用過程結(jié)束。微軟讓這些庫文件能被多個程序調(diào)用,實現(xiàn)了比較完美的共享,程序員無論要寫什么程序,只要在代碼里加入對相關DLL的調(diào)用聲明就能使用它的全部功能。最重要的是,DLL絕對不會讓你多拿一個花瓶,你要什么它就給你什么,你不要的東西它才不會給你。這樣,寫出來的程序就不能再攜帶一大堆垃圾了——絕對不會讓你把吃剩的東西帶回家,否則罰款,這是自助餐。
DLL技術(shù)的誕生,使編寫程序變成一件簡單的事情,Windows為我們提供了幾千個函數(shù)接口,足以滿足大多數(shù)程序員的需要。而且,Windows系統(tǒng)自身就是由幾千個DLL文件組成,這些DLL相互扶持,組成了強大的Windows系統(tǒng)。如果Windows使用靜態(tài)鏈接技術(shù),它的體積會有多大?我不敢想。
二、應用程序接口API
上面我們對DLL技術(shù)做了個大概分析,在里面我提到了“接口”,這又是什么呢?因為DLL不能像靜態(tài)庫文件那樣塞進程序里,所以,如何讓程序知道實現(xiàn)功能的代碼和文件成了問題,微軟就為DLL技術(shù)做了標準規(guī)范,讓一個DLL文件像奶酪一樣開了許多小洞,每個洞口都注明里面存放的功能的名字,程序只要根據(jù)標準規(guī)范找到相關洞口就可以取得它要的美味了,這個洞口就是“應用程序接口”(Application Programming Interface),每個DLL帶的接口都不相同,盡最大可能的減少了代碼的重復。用Steven的一句話:API就是一個工具箱,你根據(jù)需要取出螺絲刀、扳手,用完后再把它們放回原處。在Windows里,最基本的3個DLL文件是kernel32.dll、user32.dll、gdi32.dll。它們共同構(gòu)成了基本的系統(tǒng)框架。
1:網(wǎng)絡攝像頭
在Google中輸入“inurl:"ViewerFrame?Mode="”或者“inurl:"MultiCameraFrame?Mode="”、“inurl:"view/index.shtml"”(輸入時不帶外面的雙引號,在英文狀態(tài)下輸入),你會獲得無數(shù)個未經(jīng)加密的網(wǎng)絡攝像機監(jiān)視到的畫面。無聊的時候玩玩,可以滿足一下我們的好奇心。此外,打開這個站點:www.opentopia.com/hiddencam.php,在“from”中選擇“China”,你還可以看到國內(nèi)的某處網(wǎng)絡攝像機畫面。
*******************
2:中英文字典
Google提供了一個中英文字典,很方便使用。用戶可以按照下列方法查找詞義查找英文的中文詞義則輸入
fy computer
查找中文的英文詞義則輸入 翻譯 計算機
3:條形碼查詢
用戶輸入一個商品的條形碼就可以找到有關該產(chǎn)品的說明。
4:漢語拼音輸入檢索
為了方便使用中文的用戶在網(wǎng)上搜索,Google允許用戶直接在鍵盤上輸入漢語拼音來檢索相關事物,例如:
輸入 shanghaishikebiao
檢索結(jié)果提示:您是不是要找: 上海時刻表
這正是我們需要查找的關鍵詞,用戶可以據(jù)此瀏覽相關結(jié)果,這包括上海地區(qū)的各種交通工具的時刻表。如果需要查找更詳細的資料"上海飛機航班時刻表 ",則只要在原來的檢索結(jié)果"上海時刻表"中間輸入feijihangban ,例如:
上海feijihangban時刻表
Google的這項新功能,可以免除用戶在中文和拼音輸入方面的互相轉(zhuǎn)換。用戶在輸入拼音時,不要留有空格,否則Google會誤認為英文。Google把拼音與常用的字或者詞組一一對應,因此,過于生僻的字或詞組不適合于用這個方法查找
5。 漢語拼音輸入檢索
為了方便使用中文的用戶在網(wǎng)上搜索,Google允許用戶直接在鍵盤上輸入漢語拼音來檢索相關事物,例如:
輸入 shanghaishikebiao
檢索結(jié)果提示:您是不是要找: 上海時刻表
這正是我們需要查找的關鍵詞,用戶可以據(jù)此瀏覽相關結(jié)果,這包括上海地區(qū)的各種交通工具的時刻表。如果需要查找更詳細的資料"上海飛機航班時刻表 ",則只要在原來的檢索結(jié)果"上海時刻表"中間輸入feijihangban ,例如:
上海feijihangban時刻表
Google的這項新功能,可以免除用戶在中文和拼音輸入方面的互相轉(zhuǎn)換。用戶在輸入拼音時,不要留有空格,否則Google會誤認為英文。Google把拼音與常用的字或者詞組一一對應,因此,過于生僻的字或詞組不適合于用這個方法查找。
6。 中英文字典
經(jīng)常使用計算機的用戶手頭上自然會有一、兩個字典軟件,用于查找和翻譯中英文的詞義。作為一種使用頻率較高的工具,Google也提供了一個中英文字典,很方便使用。用戶可以按照下列方法查找詞義查找英文的中文詞義則輸入 fy computer 查找中文的英文詞義則輸入 翻譯 計算機
7。 天氣查詢
天氣情況也是人們經(jīng)常要查詢的信息之一,Google 提供的天氣查詢來自于一個更新及時的中文氣象網(wǎng)站,適合中國人使用。用戶輸入中文和英文都可以查詢,例如要了解奧運會期間雅典的天氣情況,可以按照下列方法輸入:
雅典 天氣 athens tq 返回的查詢結(jié)果中會在第一條出現(xiàn)一個 "雅典天氣預報",用戶點擊后就可以看到當天雅典的天氣情況。如果地名相同者,用戶還需要進行一次選擇。
8。 股票查詢
查詢股票的網(wǎng)站已經(jīng)很多了,Google提供的股票查詢只是更方便一些而已,用戶可以按照股票名稱、股票代碼或者股票名稱的聲母字母查詢,下列為查詢"中國聯(lián)通"股票行情的舉例。
中國聯(lián)通 股票 zglt gp
gp 600050
9。 郵政編碼和區(qū)號查詢
人們時常需要查詢郵政編碼和電話區(qū)號,Google提供了這樣一個實用的功能,用戶據(jù)此能夠獲得所要查詢的省市名稱,郵政編碼及長途電話區(qū)號,下面為查詢舉例:
郵編 杭州
區(qū)號 紹興
yb 杭州
qh 紹興
需要注意的是用戶只能查詢到城市級別的郵政編碼和區(qū)號,而無法進一步查詢區(qū)縣的具體信息。
10。 手機歸屬地查詢
用戶在輸入手機號碼后可以獲得號碼段、歸屬地、卡類型、郵政編碼和電話區(qū)號的信息,但是從實用的角度看,其中只有手機歸屬地的信息較為有用。
11。 計算器使用
Google有計算器的功能,例如在google檢索框中輸入45*86+35/7,就會得到結(jié)果:
(45 * 86) + (35 / 7) = 3 875
有興趣的用戶,或者經(jīng)常在計算機上進行運算的用戶不妨可以試一試。
12。 購物檢索
Google新開設的購物檢索稱之為Froogle,網(wǎng)址為http://froogle。google。com/
用戶只要輸入商品的名稱,就可以看到該商品的圖片和價格,用戶還可以限定一種商品的價格進行檢索,并且將檢索結(jié)果按需要從高價到低價排序列出,許多商品可以直接在網(wǎng)上訂購,這種圖文并茂的檢索購物方式較受用戶青睞。
13。 美國實用生活信息查詢
如果用戶生活在美國或者短期去美國出差和學習,下面的查詢功能或許能對他們又幫助,因為這些檢索服務目前僅限于美國。
14 地區(qū)代碼查詢
用戶輸入美國的地區(qū)代碼,在返回的檢索結(jié)果中的第一項就是該地區(qū)的地圖,用戶可以通過不斷的點擊來找到一條具體的大街。
15 飛機航班查詢
用戶輸入一家航空公司的名稱和航班號,即可獲得該航班的出發(fā)地和目的地,起飛和到達時間,以及實際航行情況,目前是否開始檢票,抵達目的地候機大樓的艙門號。
16 車牌號查詢
用戶輸入車牌號,可以獲得一輛車的名稱、型號、出廠年份,車身和發(fā)動機情況。
17 郵件查詢
用戶輸入一個郵件的號碼,可以獲悉該郵件目前的狀況,譬如郵件已經(jīng)抵達或者正在路途上等。
18。 檢索工具欄
Google的檢索工具欄功能強大,有拖放和右擊檢索功能,新聞閱讀,廣告攔截,網(wǎng)站排名顯示和搜索字詞標明等,工具欄可以附在瀏覽器下,使用更加方便。用戶可以首先在Google網(wǎng)站下載并安裝一個檢索工具欄,然后根據(jù)需要在工具欄的選項中進行設置,我們推薦用戶使用這個檢索工具欄,它將給用戶帶來許多意想不到的方便。
10.1 Google 新聞
Google 的新聞來源于4500家報刊雜志和通訊社,在精選以后持續(xù)播出世界各國的新聞,每條新聞都有更新的時間,并聯(lián)接相關的新聞。用戶可以使用免費的新聞通知服務,通過電子郵件收到自己感興趣的新聞。
10.2 網(wǎng)站排名
Google 通過對 Web 鏈接結(jié)構(gòu)和許多其它變量自動計算,對網(wǎng)頁的重要程度進行評定。網(wǎng)站排名根據(jù)這個評定能夠顯示用戶正在訪問的網(wǎng)站的重要程度,用一根綠色線條顯示,直觀而明確。
10.3 搜索字詞標明
搜索字詞標明通過鮮艷的色彩標明用戶所檢索的字詞在每個網(wǎng)頁上的位置,便于用戶查閱,單擊"搜索字詞標明"按鈕可以打開和關閉標明狀態(tài)。
10.4 拖放和右擊檢索
拖放檢索功能使檢索更為方便,用戶可以把在網(wǎng)頁上所選取的字詞直接拖放到檢索框中,Google會自動進行檢索。對于與 Web瀏覽器同時運行的許多文字處理應用程序中的文字,也可以使用此功能。右擊檢索是指用戶可以在網(wǎng)頁上選取文字后,右擊鼠標,然后從彈出式菜單中選擇"Google 搜索"便可以自動檢索。
Google搜索引擎為我們提供了搜索的方便,她正在不斷推出新的服務功能,例如為移動電話特別設計的無線搜尋等,相信隨著技術(shù)的不斷發(fā)展,我們會從中享受更多的搜索樂趣。
[以太網(wǎng)接口(畢業(yè)設計)]TCP/IP協(xié)議介紹 yzy1102 發(fā)表于 2006-1-16 19:33:00 |
TCP/IP協(xié)議,或稱為TCP/IP協(xié)議棧,或互聯(lián)網(wǎng)協(xié)議系列。
TCP/IP協(xié)議棧 (按TCP/IP參考模型劃分)
應用層 |
FTP |
SMTP |
HTTP |
... |
傳輸層 |
TCP |
UDP |
網(wǎng)絡層 |
IP ICMP |
ARP |
鏈路層 |
以太網(wǎng) |
令牌環(huán) |
FDDI |
... |
包含了一系列構(gòu)成互聯(lián)網(wǎng)基礎的網(wǎng)絡協(xié)議。這些協(xié)議最早發(fā)源于美國國防部的DARPA互聯(lián)網(wǎng)項目。TCP/IP字面上代表了兩個協(xié)議:TCP傳輸控制協(xié)議和IP互聯(lián)網(wǎng)協(xié)議。
時間回放到1983年1月1日,在這天,互聯(lián)網(wǎng)的前身Arpanet中,TCP/IP協(xié)議取代了舊的網(wǎng)絡核心協(xié)議NCP(Network Core Protocol),從而成為今天的互聯(lián)網(wǎng)的基石。最早的的TCP/IP由Vinton Cerf和Robert Kahn兩位開發(fā),慢慢地通過競爭戰(zhàn)勝了其它一些網(wǎng)絡協(xié)議的方案,比如國際標準化組織ISO的OSI模型。TCP/IP的蓬勃發(fā)展發(fā)生在上世紀的90年代中期。當時一些重要而可靠的工具的出世,例如頁面描述語言HTML和瀏覽器Mosaic,導致了互聯(lián)網(wǎng)應用的飛束發(fā)展。
隨著互聯(lián)網(wǎng)的發(fā)展,目前流行的IPv4協(xié)議(IP Version 4,IP版本四)已經(jīng)接近它的功能上限。IPv4最致命的兩個缺陷在與:
- 地址只有32位,IP地址空間有限;
- 不支持服務等級(Quality of Service, Qos)的想法,無法管理帶寬和優(yōu)先級,故而不能很好的支持現(xiàn)今越來越多的實時的語音和視頻應用。因此IPv6 (IP Version 6, IP版本六) 浮出海面,用以取代IPv4。
TCP/IP成功的另一個因素在與對為數(shù)眾多的低層協(xié)議的支持。這些低層協(xié)議對應與OSI模型 中的第一層(物理層)和第二層(數(shù)據(jù)鏈路層)。每層的所有協(xié)議幾乎都有一半數(shù)量的支持TCP/IP,例如: 以太網(wǎng)(Ethernet),令牌環(huán)(Token Ring),光纖數(shù)據(jù)分布接口(FDDI),端對端協(xié)議( PPP),X.25,幀中繼(Frame Relay),ATM,Sonet, SDH等。
目錄 |
1 TCP/IP協(xié)議棧組成
2 必須協(xié)議
3 推薦協(xié)議
4 可選協(xié)議
5 范例: 不同計算機運行的不同協(xié)議
6 參考文獻
|
TCP/IP協(xié)議棧組成
整個通信網(wǎng)絡的任務,可以劃分成不同的功能塊,即抽象成所謂的 ” 層” 。用于互聯(lián)網(wǎng)的協(xié)議可以比照TCP/IP參考模型進行分類。TCP/IP協(xié)議棧起始于第三層協(xié)議IP(互聯(lián)網(wǎng)協(xié)議) 。所有這些協(xié)議都在相應的RFC文檔中討論及標準化。重要的協(xié)議在相應的RFC文檔中均標記了狀態(tài): “必須“ (required) ,“推薦“ (recommended) ,“可選“ (elective) 。其它的協(xié)議還可能有“ 試驗“(experimental) 或“ 歷史“(historic) 的狀態(tài)。
必須協(xié)議
所有的TCP/IP應用都必須實現(xiàn)IP和ICMP。對于一個路由器(router) 而言,有這兩個協(xié)議就可以運作了,雖然從應用的角度來看,這樣一個路由器 意義不大。實際的路由器一般還需要運行許多“推薦“使用的協(xié)議,以及一些其它的協(xié)議。
在幾乎所有連接到互聯(lián)網(wǎng)上的計算機上都存在的IPv4 協(xié)議出生在1981年,今天的版本和最早的版本并沒有多少改變。升級版IPv6 的工作始于1995年,目的在與取代IPv4。ICMP 協(xié)議主要用于收集有關網(wǎng)絡的信息查找錯誤等工作。
推薦協(xié)議
每一個應用層(TCP/IP參考模型 的最高層) 一般都會使用到兩個傳輸層協(xié)議之一: 面向連接的TCP傳輸控制協(xié)議和無連接的包傳輸?shù)腢DP用戶數(shù)據(jù)報文協(xié)議 。 其它的一些推薦協(xié)議有:
- TELNET (Teletype over the Network, 網(wǎng)絡電傳) ,通過一個終端(terminal)登陸到網(wǎng)絡(運行在TCP協(xié)議上)。
- FTP (File Transfer Protocol, 文件傳輸協(xié)議) ,由名知義(運行在TCP協(xié)議上) 。
- SMTP (Simple Mail Transfer Protocol,簡單郵件傳輸協(xié)議) ,用來發(fā)送電子郵件(運行在TCP協(xié)議上) 。
- DNS (Domain Name Service,域名服務) ,用于完成地址查找,郵件轉(zhuǎn)發(fā)等工作(運行在TCP和UDP協(xié)議上) 。
- ECHO (Echo Protocol, 回繞協(xié)議) ,用于查錯及測量應答時間(運行在TCP和UDP協(xié)議上) 。
- NTP (Network Time Protocol,網(wǎng)絡時間協(xié)議) ,用于網(wǎng)絡同步(運行在UDP協(xié)議上) 。
- SNMP (Simple Network Management Protocol, 簡單網(wǎng)絡管理協(xié)議) ,用于網(wǎng)絡信息的收集和網(wǎng)絡管理。
- BOOTP (Boot Protocol,啟動協(xié)議) ,應用于無盤設備(運行在UDP協(xié)議上)。
可選協(xié)議
最常用的一些有
- 支撐萬維網(wǎng)WWW的超文本傳輸協(xié)議HTTP,
- 動態(tài)配置IP地址的DHCP(Dynamic Host Configuration Protocol,動態(tài)主機配置協(xié)議),
- 收郵件用的POP3 (Post Office Protocol, version 3, 郵局協(xié)議) ,
- 用于加密安全登陸用的SSH (Secure Shell,用于替代安全性差的TELNET) ,
- 用于動態(tài)解析以太網(wǎng)硬件地址的ARP (Address Resolution Protocol,地址解析協(xié)議) 。
范例: 不同計算機運行的不同協(xié)議
- 一個簡單的路由器上可能會實現(xiàn)ARP, IP, ICMP, UDP, SNMP, RIP。
- WWW用戶端使用ARP, IP, ICMP, UDP, TCP, DNS, HTTP, FTP。
- 一臺用戶電腦上還會運行如TELNET, SMTP, POP3, SNMP, ECHO, DHCP, SSH, NTP。
- 無盤設備可能會在固件比如ROM中實現(xiàn)了ARP, IP, ICMP, UDP, BOOT, TFTP (均為面向數(shù)據(jù)報的協(xié)議,實現(xiàn)起來相對簡單)。
TCP/IP基礎講座-1:1層,2層,3層?
讀過關于網(wǎng)絡的課程的,都知道ISO-OSI 7層協(xié)議這個名詞,許多書籍都會具體的畫出那幅圖,然后標注上物理層,數(shù)據(jù)鏈路層,網(wǎng)絡層等等.背的大家要死.但是卻又不知道具體這些層次干嗎用的勒?
其實在互聯(lián)網(wǎng)中,由于實際使用的是TCP/IP模型,也就是DOD模型(現(xiàn)在不知道沒關系,后面會說).所以7層模型在現(xiàn)實網(wǎng)絡環(huán)境中只是一個理論上,學究派的東西.這個模型中,我們真正關心的是下面的3層.
1.物理層 .哦.是的.這個名詞還算容易了解.網(wǎng)卡還有那些網(wǎng)線構(gòu)成了這一層.那些在網(wǎng)線中傳播的二進制數(shù)據(jù)流是這層的具體表象.也就是說,這一層上面沒有什么協(xié)議(不是很精確的說法,但是你可以這么理解).有的都是電流而已.我們把兩臺機器用網(wǎng)線連起來.或者用HUB把機器都連起來,這些工作就是物理層的工作.
有2個設備屬于物理層的,一個是中繼器,一個是HUB.大家知道.物理上面的連線距離一長就會產(chǎn)生電信號的衰減.為了重新加強這個信號,我們就需要在一定距離之后加上一個信號放大器,這就是中繼器(repeater)
恩...這個比較容易理解.repeater就是連接在2根網(wǎng)線之間的么.沒有做任何處理.所以只是一個物理設備.屬于1層的.
那么集線器(HUB) 呢?這個怎么會是在1層???似乎非常難以理解.
當我說出HUB的本質(zhì),大家就能夠清楚了解了
HUB的本質(zhì)其實只是一個多口中繼器(MULTI PORT REPEATER) .啊...這樣大家能夠理解了.HUB不叫多口中繼器其實只是為了銷售上面的策略.他的本質(zhì)就是連接多根網(wǎng)線的一個物理設備.也是不對經(jīng)過的電信號做任何邏輯處理的.
2.數(shù)據(jù)鏈路層
歐~這個名詞有些別扭了.DATA LINK層.英文似乎更加容易理解.
這個層面上面的東西不再是電信號了.而是DATA了.對,既然是DATA就有了邏輯關系了.這個層面上面的基本單位是幀(Frame) .這層和物理層的接觸是最緊密的.他是把從網(wǎng)線上面?zhèn)鬏數(shù)碾娏鬓D(zhuǎn)換成0和1的組合.
物理層只是網(wǎng)卡對網(wǎng)線發(fā)出或者接受各種電平信號,那就是說物理層是無法判別電流的來源和目標的.那么把電流打成0和1的幀之后.里面就有邏輯數(shù)據(jù)了.有了數(shù)據(jù),就可以判別數(shù)據(jù)從何而來,到何處去.所以也就可以真正的形成LINK.
既然可以判別地址,那么地址是按照什么來判別的呢?
那就是最重要的概念之一:MAC地址
大家肯定都聽說過我們的網(wǎng)卡都有MAC地址
有些人可能也知道MAC地址都是唯一的.
對.MAC地址是全球唯一的.也就是說你的網(wǎng)卡雖然便宜.但是他也是世界上獨一無二的.
有些人說他可以改MAC.那就不是唯一了.對.雖然可以更改,那只是欺騙上層對封包里面的MAC地址進行改寫.你網(wǎng)卡真正的MAC地址是固化的.無法修改的.
我們有了MAC地址了.這樣就可以有針對性對所有連接在一起的計算機進行通訊了.是的.我們終于可以在一個局域網(wǎng)內(nèi)通訊了.
但是有個問題我們前面沒有提到.就是既然物理層傳輸?shù)氖请娦盘?那么如果我有2臺機器一起發(fā)電信號,信號豈不是混亂了么?
非常正確.這個問題在網(wǎng)絡里面成為"碰撞",所以協(xié)議里面規(guī)定了如果你需要往外發(fā)數(shù)據(jù),一定需要先看看電纜里面有沒有別的信號.如果沒有,那就可以發(fā).如果2者同時發(fā)送,檢測到碰撞之后2者分別等待一個隨機時間,然后重發(fā).這個就是重要的"碰撞檢測 ".
哈.看來問題解決了.不是么.現(xiàn)在整個網(wǎng)絡可以正常運行了.
確實如此.但是如果連接在網(wǎng)絡上的計算機越來越多,那么碰撞的現(xiàn)象會越來越頻繁.這樣效率一定很低了.恩.這里還有一個重要概念"沖突域 ".在同一個物理上連接的網(wǎng)絡上的所有設備是屬于同一個沖突域的.
接著就需要引入我們的2層設備來分割沖突域了.
網(wǎng)橋(Bridge) 就是連接2個不同的物理網(wǎng)絡的.主要功能是在2個網(wǎng)絡之間轉(zhuǎn)發(fā)Frame.因為從實際中我們可以知道.其實很多時候并非整個網(wǎng)絡都在相互通訊.最多相互通訊的一組計算機我們可以分在一個小的沖突域內(nèi).這樣分割以后可以減少沖突域,也就相對的減少了沖突的機會.而之間使用網(wǎng)橋來橋接,由于網(wǎng)橋兩邊的通訊不是非常頻繁,所以使用網(wǎng)橋來為2邊作為"代言人".這樣任意一個小網(wǎng)絡里面產(chǎn)生沖突的機會就少了.
交換機(Switch)是我們最熟悉的設備了,交換機的本質(zhì)其實就是一個多口網(wǎng)橋(Multi port Bridge) .同理可得.交換機的每個口后面都是一個沖突域.我們都說交換機比HUB快,就是因為交換機分割了所有的沖突域.
由于現(xiàn)在交換機非常便宜.所以一般我們都是直接在交換機的口上接計算機.這樣每臺計算機都是一個獨立的沖突域.這樣碰撞的問題就沒有了.所以速度是比HUB快.
而前面說過.2層設備主要是個轉(zhuǎn)發(fā)的功能.交換機的主要功能就是轉(zhuǎn)發(fā)包.而不是讓所有的沖突域直接物理連接.所以交換機有CPU,有內(nèi)存,可以對frame進行處理等等.這些也是交換機和HUB的區(qū)別.
3.網(wǎng)絡層
我們前面的一些技術(shù)就可以構(gòu)建出局域網(wǎng)了.有了網(wǎng)絡層以后.數(shù)據(jù)才能夠真正的在整個世界間傳送
由于倫納德?博薩卡(Leonard Bosack)和姍蒂?雷納(Sandy Lerner)為了解決他們之間的通信問題(關于路由器發(fā)明的版本有很多.你聽到的別的說法可能比這個說法更準確,但是誰知道呢.呵呵).路由器被發(fā)明用來解決"信息孤島"問題.而且如果是由SWITCH來構(gòu)建整個網(wǎng)絡,那么整個網(wǎng)絡將會有"中心節(jié)點",這樣也不符合ARPANET的初衷.所以我們有了這一層.(這樣說可能會感覺本末倒置,但是先這么理解吧.)
這一層的基本單元是包(Packet) .所有的包都有一個IP頭.啊.聽起來很熟悉不是么.IP就是用來在這層上面標識包的來源和目的地址的.
這層的一個主要概念就是"路由 ",也就是和switch一樣,把包轉(zhuǎn)發(fā)到其他的地方.不過有個不同的地方,switch只有知道具體的MAC在哪里的情況下才能夠發(fā)送給指定的計算機,而路由則不需要知道最終IP所在的計算機在哪個位置,只要知道那個途徑可以過去就可以工作.
這3層構(gòu)建了整個網(wǎng)絡的基礎.由于TCP/IP模型將最下面2層合并成為一層,所以在TCP/IP里面總共這2層也是整個構(gòu)架最基礎的內(nèi)容.而網(wǎng)絡方面要做的工作也都是針對于這2層做的.
2: TCP/IP.真實世界的模型
上一講里面我們說過OSI 7層模型只是一個理論模型,而實際中只需要保證7層的功能能夠?qū)崿F(xiàn),實際分層無需按照7層來分.而且如果真的分7層.那么數(shù)據(jù)處理的速度便要慢許多.
在實際應用中.使用最多的便是DoD模型.也成為TCP/IP協(xié)議簇
DoD模型(Department Of Defanse Model 美國國防部模型) 顧名思義,是美國國防部設計的一個網(wǎng)絡模型.最早用于ARPANET.這些話可能在許多教材的第一章就會講了.但是一般教材對于DoD模型與OSI模型對應關系都沒有講到.或者很多是模糊或者錯誤的.
在這里我就要描述一下2者對應關系.OSI模型有7層我們已經(jīng)知道了,而DoD模型則只有4層.下面是對應關系
OSI DoD
7.Application ┐
6.Presentation |-> 4. Application/Process
5.Session ┘
4.Transport ---> 3. Host to Host
3.Network ---> 2. Internet
2.Data Link ┬-> 1. Network Access
1.Physical ┘
由于我不會制表符.所以圖有些難看.其實就是OSI的1.2層對應DoD的第1層
OSI的5.6.7對應DoD的第4層
其實這個還是比較容易記憶的
由于物理層和數(shù)據(jù)鏈路層非常密切.所以分為一個.然后上面依次對應,最上面的一大塊成為應用層(處理層)
現(xiàn)在我們有了一個可用的實際模型了.不過一般我們在描述某個設備或者協(xié)議的時候.還是會使用OSI的模型,比如我們在討論SWITCH的時候,就會說他是一個2層的設備.而路由器是一個3層的設備,還會有一些特殊的設備,比如3層交換機,4層交換機.這些都是使用OSI模型進行分類的.這點大家不要搞混淆了.
我們一直聽說TCP或者UDP.還有什么SMTP.POP3.這些協(xié)議到底是在哪一層定義的那?接下來的一張圖會給大家一個非常清晰的概念了(不能算是圖拉 :D ).
4. APPLICATION
HTTP,FTP,telnet,SNMP,SMTP,POP3,DNS 等等
3.Host to Host
TCP,UDP
2.internet
ICMP,ARP,RARP,IP
1.Network Access
Ethernet,FastEthernet,Token Ring 等等
恩...這下清楚了.讓我們從下至上來看看
首先是最下層的.包括了以太網(wǎng),快速以太網(wǎng),還有現(xiàn)在的千M以太網(wǎng)等等的協(xié)議,這些協(xié)議規(guī)定了線纜的絞數(shù).連接方式等等物理層的東西.還有底層使用MAC通訊的方式等等.
接下來是IP.ARP這些.IP在OSI模型的時候也說過.通過IP地址.我們在轉(zhuǎn)發(fā)包的時候無需知道具體目標機的位置.而路由器自然會根據(jù)路由表來轉(zhuǎn)發(fā).最后一站一站的慢慢傳遞.達到最終目標.而ARP協(xié)議就是在IP和MAC之間轉(zhuǎn)換用的.
我在上一章提過,由于有了路由器,IP,整個網(wǎng)絡才真正能夠覆蓋全球.所以這一層叫做internet大家也應該容易記憶了.
WOW.TCP,UDP是我們聽說最多的了.他是屬于控制網(wǎng)絡連接的.在OSI稱為Transport.傳輸層.在DoD內(nèi)是Host to Host 端對端.意思其實是一樣的.就是在在2臺計算機之間構(gòu)建出一個虛擬的通訊通道來.
最上面一層就無窮無盡了.所有的最終應用層的東西都在這里,你甚至可以定義你自己的協(xié)議類型.這些都是完全可以的.因為本身這一層就是提供給開發(fā)人員自行發(fā)揮的.只是上面列舉的都經(jīng)過標準化了.
TCP包頭結(jié)構(gòu)
源端口 16位
目標端口 16位
序列號 32位
回應序號 32位
TCP頭長度 4位
reserved 6位
控制代碼 6位
窗口大小 16位
偏移量 16位
校驗和 16位
選項 32位(可選)
這樣我們得出了TCP包頭的最小大小.就是20字節(jié).
UDP包頭結(jié)構(gòu)
源端口 16位
目的端口 16位
長度 16位
校驗和 16位
恩...UDP的包小很多.確實如此.因為UDP是非可靠連接.設計初衷就是盡可能快的將數(shù)據(jù)包發(fā)送出去.所以UDP協(xié)議顯得非常精簡.
有一個問題,似乎這些頭里面怎么沒有IP地址啊.沒有IP地址這些包往哪里發(fā)送那?
對.你觀察的很仔細.TCP和UDP的頭里面確實沒有任何IP信息.我們回頭想一下TCP和UDP是屬于DoD的哪一層的? 對了!是第3層. 而IP則位于模型的第二層.也就是他們兩者雖然有聯(lián)系.但是不屬于同一層.
模型的一個重要規(guī)則就是.當發(fā)送端發(fā)送一個數(shù)據(jù),上一層將數(shù)據(jù)傳往下一層的時候.上一層的包就成為了下一層包的數(shù)據(jù)部分.
而到接受端接受到數(shù)據(jù).下一層將本層的頭部信息去掉后交給上一層去處理.
那么我們來看看實際例子:
假使我們通過SMTP協(xié)議發(fā)送數(shù)據(jù)AAA到另外一段.那么數(shù)據(jù)先會被加上SMTP的頭.成為[SMTP]AAA.往下發(fā)送到TCP層.成為[TCP][SMTP]AAA.再往下送到internet層[IP][TCP][SMTP]AAA.然后成為[MAC][IP][TCP][SMTP]AAA
這樣通過enternet或者FastEnternet發(fā)送到路由器.路由器得到后替換自己的MAC地址上去.傳到下一級的路由器.這樣經(jīng)過長途跋涉.最終這個數(shù)據(jù)流到達目標機.
目標機先從下面一層開始.去掉MAC,成為[IP][TCP][SMTP]AAA往上到IP層,恩,比對后是發(fā)送給我這個IP的.去掉,成為[TCP][SMTP]AAA.TCP接到了查看校驗和,沒錯.往上[SMTP]AAA.最后SMTP協(xié)議去解釋.得到了AAA.
萬里長征終于結(jié)束.我們也將AAA發(fā)送到了目標機.大家也應該明白了為何TCP包頭和UDP包頭里面沒有IP地址那?因為IP位于他們下面一層.TCP和UDP的包頭信息是作為IP包的數(shù)據(jù)段來傳送的.
IP層可不管那許多.他只管他那層的協(xié)議,也就是管把從上面層來的數(shù)據(jù)加上自己的頭,傳到下面一層.把從下面一層來的數(shù)據(jù)去掉頭.傳到上面一層.
每層都是這么干的.完美的契合完成了數(shù)據(jù)包的最終旅程.
TCP/IP的通訊協(xié)議
這部分簡要介紹一下TCP/IP的內(nèi)部結(jié)構(gòu)。TCP/IP協(xié)議組之所以流行,部分原因是因為它可以用在各種各樣的信道和底層協(xié)議(例如T1和X.25、以太網(wǎng)以及RS-232串行接口)之上。確切地說,TCP/IP協(xié)議是一組包括TCP協(xié)議和IP協(xié)議,UDP(User Datagram Protocol)協(xié)議、ICMP(Internet Control Message Protocol)協(xié)議和其他一些協(xié)議的協(xié)議組。
TCP/IP整體構(gòu)架概述
TCP/IP協(xié)議并不完全符合OSI的七層參考模型。傳統(tǒng)的開放式系統(tǒng)互連參考模型,是一種通信協(xié)議的7層抽象的參考模型,其中每一層執(zhí)行某一特定任務。該模型的目的是使各種硬件在相同的層次上相互通信。這7層是:物理層、數(shù)據(jù)鏈路層、網(wǎng)路層、傳輸層、話路層、表示層和應用層。而TCP/IP通訊協(xié)議采用了4層的層級結(jié)構(gòu),每一層都呼叫它的下一層所提供的網(wǎng)絡來完成自己的需求。這4層分別為:
應用層:應用程序間溝通的層,如簡單電子郵件傳輸(SMTP)、文件傳輸協(xié)議(FTP)、網(wǎng)絡遠程訪問協(xié)議(Telnet)等。
傳輸層:在此層中,它提供了節(jié)點間的數(shù)據(jù)傳送服務,如傳輸控制協(xié)議(TCP)、用戶數(shù)據(jù)報協(xié)議(UDP)等,TCP和UDP給數(shù)據(jù)包加入傳輸數(shù)據(jù)并把它傳輸?shù)较乱粚又校@一層負責傳送數(shù)據(jù),并且確定數(shù)據(jù)已被送達并接收。
互連網(wǎng)絡層:負責提供基本的數(shù)據(jù)封包傳送功能,讓每一塊數(shù)據(jù)包都能夠到達目的主機(但不檢查是否被正確接收),如網(wǎng)際協(xié)議(IP)。
網(wǎng)絡接口層:對實際的網(wǎng)絡媒體的管理,定義如何使用實際網(wǎng)絡(如Ethernet、Serial Line等)來傳送數(shù)據(jù)。
TCP/IP中的協(xié)議
以下簡單介紹TCP/IP中的協(xié)議都具備什么樣的功能,都是如何工作的:
1. IP
網(wǎng)際協(xié)議IP是TCP/IP的心臟,也是網(wǎng)絡層中最重要的協(xié)議。
IP層接收由更低層(網(wǎng)絡接口層例如以太網(wǎng)設備驅(qū)動程序)發(fā)來的數(shù)據(jù)包,并把該數(shù)據(jù)包發(fā)送到更高層---TCP或UDP層;相反,IP層也把從TCP或UDP層接收來的數(shù)據(jù)包傳送到更低層。IP數(shù)據(jù)包是不可靠的,因為IP并沒有做任何事情來確認數(shù)據(jù)包是按順序發(fā)送的或者沒有被破壞。IP數(shù)據(jù)包中含有發(fā)送它的主機的地址(源地址)和接收它的主機的地址(目的地址)。
高層的TCP和UDP服務在接收數(shù)據(jù)包時,通常假設包中的源地址是有效的。也可以這樣說,IP地址形成了許多服務的認證基礎,這些服務相信數(shù)據(jù)包是從一個有效的主機發(fā)送來的。IP確認包含一個選項,叫作IP source routing,可以用來指定一條源地址和目的地址之間的直接路徑。對于一些TCP和UDP的服務來說,使用了該選項的IP包好象是從路徑上的最后一個系統(tǒng)傳遞過來的,而不是來自于它的真實地點。這個選項是為了測試而存在的,說明了它可以被用來欺騙系統(tǒng)來進行平常是被禁止的連接。那么,許多依靠IP源地址做確認的服務將產(chǎn)生問題并且會被非法入侵。
2. TCP
如果IP數(shù)據(jù)包中有已經(jīng)封好的TCP數(shù)據(jù)包,那么IP將把它們向‘上’傳送到TCP層。TCP將包排序并進行錯誤檢查,同時實現(xiàn)虛電路間的連接。TCP數(shù)據(jù)包中包括序號和確認,所以未按照順序收到的包可以被排序,而損壞的包可以被重傳。
TCP將它的信息送到更高層的應用程序,例如Telnet的服務程序和客戶程序。應用程序輪流將信息送回TCP層,TCP層便將它們向下傳送到IP層,設備驅(qū)動程序和物理介質(zhì),最后到接收方。
面向連接的服務(例如Telnet、FTP、rlogin、X Windows和SMTP)需要高度的可靠性,所以它們使用了TCP。DNS在某些情況下使用TCP(發(fā)送和接收域名數(shù)據(jù)庫),但使用UDP傳送有關單個主機的信息。
3.UDP
UDP與TCP位于同一層,但對于數(shù)據(jù)包的順序錯誤或重發(fā)。因此,UDP不被應用于那些使用虛電路的面向連接的服務,UDP主要用于那些面向查詢---應答的服務,例如NFS。相對于FTP或Telnet,這些服務需要交換的信息量較小。使用UDP的服務包括NTP(網(wǎng)落時間協(xié)議)和DNS(DNS也使用TCP)。
欺騙UDP包比欺騙TCP包更容易,因為UDP沒有建立初始化連接(也可以稱為握手)(因為在兩個系統(tǒng)間沒有虛電路),也就是說,與UDP相關的服務面臨著更大的危險。
4.ICMP
ICMP與IP位于同一層,它被用來傳送IP的的控制信息。它主要是用來提供有關通向目的地址的路徑信息。ICMP的‘Redirect’信息通知主機通向其他系統(tǒng)的更準確的路徑,而‘Unreachable’信息則指出路徑有問題。另外,如果路徑不可用了,ICMP可以使TCP連接‘體面地’終止。PING是最常用的基于ICMP的服務。
5. TCP和UDP的端口結(jié)構(gòu)
TCP和UDP服務通常有一個客戶/服務器的關系,例如,一個Telnet服務進程開始在系統(tǒng)上處于空閑狀態(tài),等待著連接。用戶使用Telnet客戶程序與服務進程建立一個連接。客戶程序向服務進程寫入信息,服務進程讀出信息并發(fā)出響應,客戶程序讀出響應并向用戶報告。因而,這個連接是雙工的,可以用來進行讀寫。
兩個系統(tǒng)間的多重Telnet連接是如何相互確認并協(xié)調(diào)一致呢?TCP或UDP連接唯一地使用每個信息中的如下四項進行確認:
源IP地址 發(fā)送包的IP地址。
目的IP地址 接收包的IP地址。
源端口 源系統(tǒng)上的連接的端口。
目的端口 目的系統(tǒng)上的連接的端口。
端口是一個軟件結(jié)構(gòu),被客戶程序或服務進程用來發(fā)送和接收信息。一個端口對應一個16比特的數(shù)。服務進程通常使用一個固定的端口,例如,SMTP使用25、Xwindows使用6000。這些端口號是‘廣為人知’的,因為在建立與特定的主機或服務的連接時,需要這些地址和目的地址進行通訊。 |
|
[轉(zhuǎn)]www.rising.com.cn 2005-4-11 16:37:00 信息源:瑞星編譯 |
|
一、什么是RSS?
也許大家是第一次聽到RSS這個概念,那什么是RSS呢?RSS是站點用來和其他站點之間共享內(nèi)容的一種簡易方式(也叫聚合內(nèi)容),通常被用于新聞和其他按順序排列的網(wǎng)站,例如Blog。一段項目的介紹可能包含新聞的全部介紹等。或者僅僅是額外的內(nèi)容或者簡短的介紹。這些項目的鏈接通常都能鏈接到全部的內(nèi)容。網(wǎng)絡用戶可以在客戶端借助于支持RSS的新聞聚合工具軟件,在不打開網(wǎng)站內(nèi)容頁面的情況下閱讀支持RSS輸出的網(wǎng)站內(nèi)容。
說得更加簡單一點,RSS就是一種用來分發(fā)和匯集網(wǎng)頁內(nèi)容的XML格式!如果你還是不太明白,沒有關系,RSS是什么其實基本就不重要,重要的是RSS可以做什么,下面我們就來了解一下,RSS能給我們帶來什么?
小知識
BLOG:BLOG是Web Log的簡稱。在國內(nèi),人們通常稱它為博客。它是一種作者與讀者以日記風格進行交互的中介。在軟件社區(qū),人們以博客形式來共享觀念與思想變得越來越流行,人們開始以博客的形式互相學習,博客已經(jīng)成了一個技術(shù)交流的場所!如:http://blogs.msdn.com 就是MSDN上的一個blogging。而在國內(nèi)博客中國也已經(jīng)越來越有名。http://www.blogchina.com。
XML:XML是Extensible Markup Language的簡寫,一種擴展性標識語言。
二、RSS的歷史
那么RSS究竟代表什么呢?比較普遍的有兩種說法,一種是“Rich Site Summary”或“RDF Site Summary”,另一種是“Really Simple Syndication”,之所以有這些分歧,需要從RSS發(fā)展的歷史說起。
最初的0.90版本RSS是由Netscape公司設計的,目的是用來建立一個整合了各主要新聞站點內(nèi)容的門戶,但是0.90版本的RSS規(guī)范過于復雜,而一個簡化的RSS 0.91版本也隨著Netscape公司對該項目的放棄而于2000年暫停。
不久,一家專門從事博客寫作軟件開發(fā)的公司UserLand接手了RSS 0.91版本的發(fā)展,并把它作為其博客寫作軟件的基礎功能之一繼續(xù)開發(fā),逐步推出了0.92、0.93和0.94版本。隨著網(wǎng)絡博客的流行,RSS作為一種基本的功能也被越來越多的網(wǎng)站和博客軟件支持。
在UserLand公司接手并不斷開發(fā)RSS的同時,很多的專業(yè)人士認識到需要通過一個第三方、非商業(yè)的組織,把RSS發(fā)展成為一個通用的規(guī)范,并進一步標準化。于是2001年一個聯(lián)合小組在0.90版本RSS的開發(fā)原則下,以W3C新一代的語義網(wǎng)技術(shù)RDF(Resource Description Framework)為基礎,對RSS進行了重新定義,發(fā)布RSS1.0,并將RSS定義為“RDF Site Summary”。但是這項工作沒有與UserLand公司進行有效的溝通,UserLand公司也不承認RSS 1.0的有效性,并堅持按照自己的設想進一步開發(fā)出RSS的后續(xù)版本,到2002年9月發(fā)布了最新版本RSS 2.0,UserLand公司將RSS定義為“Really Simple Syndication”。
目前RSS已經(jīng)分化為RSS 0.9x/2.0和RSS 1.0兩個陣營,由于分歧的存在和RSS 0.9x/2.0的廣泛應用現(xiàn)狀,RSS 1.0還沒有成為標準化組織的真正標準。
三、RSS可以干什么?
1.訂閱BLOG(BLOG上,你可以訂閱你工作中所需的技術(shù)文章;也可以訂閱與你有共同愛好的作者的日志,總之,BLOG上你對什么感興趣你就可以訂什么)
2.訂閱新聞(無論是奇聞怪事、明星消息、體壇風云,只要你想知道的,都可以訂閱)
你再也不用一個網(wǎng)站一個網(wǎng)站,一個網(wǎng)頁一個網(wǎng)頁去逛了。只要這將你需要的內(nèi)容訂閱在一個RSS閱讀器中,這些內(nèi)容就會自動出現(xiàn)你的閱讀器里,你也不必為了一個急切想知道的消息而不斷的刷新網(wǎng)頁,因為一旦有了更新,RSS閱讀器就會自己通知你!
三、RSS閱讀器
目前,RSS閱讀器基本可以分為兩類。
第一類大多數(shù)閱讀器是運行在計算機桌面上的單機應用程序,通過所訂閱網(wǎng)站和博客(blog)中的新聞供應,可自動、定時地更新新聞標題。在該類閱讀器中,有Awasu、FeedDemon和RSSReader這三款流行的單機版閱讀器都提供免費試用版和付費高級版,另外,新華網(wǎng)在不久前也推出了一款RSS閱讀器,它不僅是完全是中文界面,而且目前還是完全的免費軟件!(后面我們就將以這款軟件為例,為大家介紹怎樣來使用RSS閱讀器)
第二類新聞閱讀器通常是內(nèi)嵌于已在計算機中運行的應用程序中。例如,NewsGator內(nèi)嵌在微軟的Outlook中,所訂閱的新聞標題位于Outlook的收件箱文件夾中。另外,Pluck內(nèi)嵌在Internet Explorer瀏覽器中!
四、RSS的聯(lián)合(Syndication)和聚合(Aggregation)
發(fā)布一個RSS文件(一般稱為RSS Feed)后,這個RSS Feed中包含的信息就能直接被其他站點調(diào)用,而且由于這些數(shù)據(jù)都是標準的XML格式,所以也能在其他的終端和服務中使用,如PDA、手機、郵件列表等。而且一個網(wǎng)站聯(lián)盟(比如專門討論旅游的網(wǎng)站系列)也能通過互相調(diào)用彼此的RSS Feed,自動的顯示網(wǎng)站聯(lián)盟中其他站點上的最新信息,這就叫著RSS的聯(lián)合。這種聯(lián)合就導致一個站點的內(nèi)容更新越及時、RSS Feed被調(diào)用的越多,該站點的知名度就會越高,從而形成一種良性循環(huán)。
而所謂RSS聚合,就是通過軟件工具的方法從網(wǎng)絡上搜集各種RSS Feed并在一個界面中提供給讀者進行閱讀。這些軟件可以是在線的WEB工具,如http://my.netscape.com ,http://my.userland.com , http://www.xmltree.com ,http://www.moreover.com ,http://www.oreillynet.com/meerkat 等,也可以是下載到客戶端安裝的工具
五、RSS的未來發(fā)展
隨著越來越多的站點對RSS的支持,RSS已經(jīng)成為目前最成功的XML應用。RSS搭建了信息迅速傳播的一個技術(shù)平臺,使得每個人都成為潛在的信息提供者。相信很快我們就會看到大量基于RSS的專業(yè)門戶、聚合站點和更精確的搜索引擎。
| |
摘要: [轉(zhuǎn)]http://www.54bk.com/user1/8454/archives/2005/26611.html1. 什么是webservice
從表面上看,Web service 就是一個應用程序,它向外界暴露出一個能夠通過Web進行調(diào)用的API。這就是說,你能夠用編程的方法通過Web來調(diào)用這個應用程序。
對Web service 更精確的解釋: Web services是建立可...
閱讀全文
使用XML的五種場合
主 題: 使用XML的五種場合[精華]
作 者: ChinaOk (藍蝶[授人以魚,不如授人以漁])
等 級:
信 譽 值: 103
所屬論壇: XML/SOAP
問題點數(shù): 1
回復次數(shù): 76
發(fā)表時間: 2002-4-8 16:54:32
在很多研討會和培訓班上我遇到過許多人,他們還不明白為什么要使用XML也不知道如何
在他們的應用中使用XML。一些來自諸如Gartner公司的報告建議說,商業(yè)公司不能再做
局外人了,不能對XML置之不理。如果你還不清楚XML到底有什么好處的話,你并不是唯
一的人。
我決定把與人們和媒體關于XML話題的交談整理成文,列出XML在應用中的五個最令人喜
愛的用法。盡管這些并不能包含XML的所有潛在應用,至少是些最重要的領域。
1、數(shù)據(jù)交換
用XML在應用程序和公司之間作數(shù)據(jù)交換已不是什么秘密了,毫無疑問應被列為第一位。
那么為什么XML在這個領域里的地位這么重要呢?原因就是XML使用元素和屬性來描述數(shù)
據(jù)。在數(shù)據(jù)傳送過程中,XML始終保留了諸如父/子關系這樣的數(shù)據(jù)結(jié)構(gòu)。幾個應用程序
可以共享和解析同一個XML文件,不必使用傳統(tǒng)的字符串解析或拆解過程。
相反,普通文件不對每個數(shù)據(jù)段做描述(除了在頭文件中),也不保留數(shù)據(jù)關系結(jié)構(gòu)。使
用XML做數(shù)據(jù)交換可以使應用程序更具有彈性,因為可以用位置(與普通文件一樣)或用元
素名(從數(shù)據(jù)庫)來存取XML數(shù)據(jù)。
2、Web服務
Web服務是最令人激動的革命之一,它讓使用不同系統(tǒng)和不同編程語言的人們能夠相互交
流和分享數(shù)據(jù)。其基礎在于Web服務器用XML在系統(tǒng)之間交換數(shù)據(jù)。交換數(shù)據(jù)通常用XML標
記,能使協(xié)議取得規(guī)范一致,比如在簡單對象處理協(xié)議(Simple Object Access Protoc
ol, SOAP)平臺上。
SOAP可以在用不同編程語言構(gòu)造的對象之間傳遞消息。這意味著一個C#對象能夠與一個
Java對象進行通訊。這種通訊甚至可以發(fā)生在運行于不同操作系統(tǒng)上的對象之間。DCOM
, CORBA或Java RMI只能在緊密耦合的對象之間傳遞消息,SOAP則可在松耦合對象之間傳
遞消息。
3、內(nèi)容管理
XML只用元素和屬性來描述數(shù)據(jù),而不提供數(shù)據(jù)的顯示方法。這樣,XML就提供了一個優(yōu)
秀的方法來標記獨立于平臺和語言的內(nèi)容。
使用象XSLT這樣的語言能夠輕易地將XML文件轉(zhuǎn)換成各種格式文件,比如HTML, WML, PD
F, flat file, EDI, 等等。XML具有的能夠運行于不同系統(tǒng)平臺之間和轉(zhuǎn)換成不同格式
目標文件的能力使得它成為內(nèi)容管理應用系統(tǒng)中的優(yōu)秀選擇。
4、Web集成
現(xiàn)在有越來越多的設備也支持XML了。使得Web開發(fā)商可以在個人電子助理和瀏覽器之間
用XML來傳遞數(shù)據(jù)。
為什么將XML文本直接送進這樣的設備去呢?這樣作的目的是讓用戶更多地自己掌握數(shù)據(jù)
顯示方式,更能體驗到實踐的快樂。常規(guī)的客戶/服務(C/S)方式為了獲得數(shù)據(jù)排序或更
換顯示格式,必須向服務器發(fā)出申請;而XML則可以直接處理數(shù)據(jù),不必經(jīng)過向服務器申
請查詢-返回結(jié)果這樣的雙向“旅程”,同時在設備也不需要配制數(shù)據(jù)庫。
甚至還可以對設備上的XML文件進行修改并將結(jié)果返回給服務器。想像一下,一臺具有互
聯(lián)網(wǎng)功能并支持XML的電冰箱將會給市場帶來多么大的沖擊吧。你從此不必早起去取牛奶
了!
5、配制
許多應用都將配制數(shù)據(jù)存儲在各種文件里,比如.INI文件。雖然這樣的文件格式已經(jīng)使
用多年并一直很好用,但是XML還是以更為優(yōu)秀的方式為應用程序標記配制數(shù)據(jù)。使用.
NET里的類,如XmlDocument和XmlTextReader,將配制數(shù)據(jù)標記為XML格式,能使其更具
可讀性,并能方便地集成到應用系統(tǒng)中去。使用XML配制文件的應用程序能夠方便地處理
所需數(shù)據(jù),不用象其他應用那樣要經(jīng)過重新編譯才能修改和維護應用系統(tǒng)。
如前所述,這里提到的五種使用XML的途徑不包括全部場合。