<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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 張永耀 閱讀(396) | 評論 (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 張永耀 閱讀(183) | 評論 (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 張永耀 閱讀(194) | 評論 (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 張永耀 閱讀(366) | 評論 (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 張永耀 閱讀(362) | 評論 (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 張永耀 閱讀(133) | 評論 (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 張永耀 閱讀(629) | 評論 (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 張永耀 閱讀(1310) | 評論 (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 張永耀 閱讀(158) | 評論 (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 張永耀 閱讀(189) | 評論 (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 張永耀 閱讀(169) | 評論 (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 張永耀 閱讀(175) | 評論 (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"?>  

    " <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"?>    
    "
    <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 張永耀 閱讀(315) | 評論 (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 張永耀 閱讀(308) | 評論 (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 張永耀 閱讀(488) | 評論 (0)編輯 收藏

    主站蜘蛛池模板: 亚洲av永久无码精品秋霞电影影院| 亚洲∧v久久久无码精品| 成人a毛片免费视频观看| 亚洲熟妇av一区二区三区| 免费视频成人片在线观看| 一本色道久久88—综合亚洲精品 | 免费v片视频在线观看视频| 国产高清视频免费在线观看| 亚洲国产成人久久综合碰碰动漫3d| 99久久久国产精品免费无卡顿| 美女黄频a美女大全免费皮| 亚洲成色WWW久久网站| 国产精品免费看久久久无码| 免费毛片a线观看| 精品久久亚洲一级α| 亚洲三级电影网站| 国产免费观看青青草原网站| 男人进去女人爽免费视频国产| 亚洲1区2区3区精华液| 亚洲精品高清视频| 亚洲Aⅴ无码一区二区二三区软件 亚洲AⅤ视频一区二区三区 | 成人福利在线观看免费视频| 亚洲成综合人影院在院播放| 亚洲AV无码专区日韩| 国产精品久久久久免费a∨| 99精品免费视频| 麻豆安全免费网址入口| 亚洲国产高清美女在线观看| 亚洲最大AV网站在线观看| 热99re久久精品精品免费| 50岁老女人的毛片免费观看| 岛国岛国免费V片在线观看| 亚洲国产成人精品无码区二本| 97亚洲熟妇自偷自拍另类图片| 亚洲精品美女久久久久99小说| 成人毛片免费网站| 日韩精品免费在线视频| igao激情在线视频免费| 亚洲AV无码一区二区三区牲色| 91亚洲视频在线观看| 亚洲AV午夜成人片|