作者: 神碼 時(shí)間: 2012-4-1 20:27 標(biāo)題: HTTP請求模型、頭信息參考,、AAuto開發(fā)實(shí)例 一,、連接至Web服務(wù)器 一個(gè)客戶端應(yīng)用(如Web瀏覽器)打開到Web服務(wù)器的HTTP端口的一個(gè)套接字(缺省為80),。 例如:http://www.:80/index.html 在AAuto中,這將等同于代碼: import wsock.tcp.client; 通過連接,,客戶端寫一個(gè)ASCII文本請求行,, 后跟0或多個(gè)HTTP頭標(biāo),一個(gè)空行和實(shí)現(xiàn)請求的任意數(shù)據(jù),。 一個(gè)請求由四個(gè)部分組成:請求行,、請求頭標(biāo),、空行和請求數(shù)據(jù) 1.請求行:請求行由三個(gè)標(biāo)記組成:請求方法,、請求URI和HTTP版本,,它們用空格分隔。 例如:GET /index.html HTTP/1.1 HTTP規(guī)范定義了8種可能的請求方法: GET 檢索URI中標(biāo)識資源的一個(gè)簡單請求 HEAD 與GET方法相同,服務(wù)器只返回狀態(tài)行和頭標(biāo),,并不返回請求文檔 POST 服務(wù)器接受被寫入客戶端輸出流中的數(shù)據(jù)的請求 PUT 服務(wù)器保存請求數(shù)據(jù)作為指定URI新內(nèi)容的請求 DELETE 服務(wù)器刪除URI中命名的資源的請求 OPTIONS 關(guān)于服務(wù)器支持的請求方法信息的請求 TRACE Web服務(wù)器反饋Http請求和其頭標(biāo)的請求 CONNECT 已文檔化但當(dāng)前未實(shí)現(xiàn)的一個(gè)方法,,預(yù)留做隧道處理 2.請求頭標(biāo):由關(guān)鍵字/值對組成,每行一對,,關(guān)鍵字和值用冒號(:)分隔。 請求頭標(biāo)通知服務(wù)器有關(guān)于客戶端的功能和標(biāo)識,,典型的請求頭標(biāo)有: User-Agent 客戶端廠家和版本 Accept 客戶端可識別的內(nèi)容類型列表 Content-Length 附加到請求的數(shù)據(jù)字節(jié)數(shù) 3.空行:最后一個(gè)請求頭標(biāo)之后是一個(gè)空行,,發(fā)送回車符和退行,,通知服務(wù)器以下不再有頭標(biāo)。 4.請求數(shù)據(jù):使用POST傳送數(shù)據(jù),,最常使用的是Content-Type和Content-Length頭標(biāo)。 下面使用 AAuto模擬上面的過程: import wsock.tcp.client; 三、服務(wù)端接受請求并返回HTTP響應(yīng) Web服務(wù)器解析請求,,定位指定資源,。服務(wù)器將資源副本寫至套接字,,在此處由客戶端讀取,。 一個(gè)響應(yīng)由四個(gè)部分組成,;狀態(tài)行,、響應(yīng)頭標(biāo),、空行,、響應(yīng)數(shù)據(jù) 1.狀態(tài)行:狀態(tài)行由三個(gè)標(biāo)記組成:HTTP版本,、響應(yīng)代碼和響應(yīng)描述。 HTTP版本:向客戶端指明其可理解的最高版本,。 響應(yīng)代碼:3位的數(shù)字代碼,指出請求的成功或失敗,,如果失敗則指出原因。 響應(yīng)描述:為響應(yīng)代碼的可讀性解釋,。 例如:HTTP/1.1 200 OK HTTP響應(yīng)碼: 1xx:信息,,請求收到,繼續(xù)處理 2xx:成功,,行為被成功地接受,、理解和采納 3xx:重定向,,為了完成請求,必須進(jìn)一步執(zhí)行的動(dòng)作 4xx:客戶端錯(cuò)誤: 2.響應(yīng)頭標(biāo):像請求頭標(biāo)一樣,,它們指出服務(wù)器的功能,,標(biāo)識出響應(yīng)數(shù)據(jù)的細(xì)節(jié),。 3.空行:最后一個(gè)響應(yīng)頭標(biāo)之后是一個(gè)空行,發(fā)送回車符和退行,,表明服務(wù)器以下不再有頭標(biāo)。 4.響應(yīng)數(shù)據(jù):HTML文檔和圖像等,,也就是HTML本身。 下面使用AAuto模擬實(shí)現(xiàn)一個(gè)完整的HTTP請求響應(yīng)過程: import wsock.tcp.client; 四,、服務(wù)器關(guān)閉連接,瀏覽器解析響應(yīng) 1.瀏覽器首先解析狀態(tài)行,,查看表明請求是否成功的狀態(tài)代碼,。 2.然后解析每一個(gè)響應(yīng)頭標(biāo),頭標(biāo)告知以下為若干字節(jié)的HTML,。 3.讀取響應(yīng)數(shù)據(jù)HTML,根據(jù)HTML的語法和語義對其進(jìn)行格式化,,并在瀏覽器窗口中顯示它,。 4.一個(gè)HTML文檔可能包含其它需要被載入的資源引用,,瀏覽器識別這些引用,,對其它的資源再進(jìn)行額外的請求,此過程循環(huán)多次,。 HTTP模型是無狀態(tài)的,,表明在處理一個(gè)請求時(shí),,Web服務(wù)器并不記住來自同一客戶端的請求,。 六、實(shí)例 1.瀏覽器發(fā)出請求 GET /index.html HTTP/1.1 服務(wù)器返回響應(yīng) HTTP /1.1 200 OK Date: Apr 11 2006 15:32:08 GMT Server: Apache/2.0.46(win32) Content-Length: 119 Content-Type: text/html <HTML> <HEAD> <LINK REL=”stylesheet” HREF=”index.css”> </HEAD> <BODY> <IMG SRC=”image/logo.png”> </BODY> </HTML> 2.瀏覽器發(fā)出請求 GET /index.css HTTP/1.1 服務(wù)器返回響應(yīng) HTTP /1.1 200 OK Date: Apr 11 2006 15:32:08 GMT Server: Apache/2.0.46(win32) Connection: Keep-alive, close Content-Length: 70 Content-Type: text/plane h3{ font-size:20px; font-weight:bold; color:#005A9C; } 3.瀏覽器發(fā)出請求 GET image/logo.png HTTP/1.1 服務(wù)器返回響應(yīng) HTTP /1.1 200 OK Date: Apr 11 2006 15:32:08 GMT Server: Apache/2.0.46(win32) Connection: Keep-alive, close Content-Length: 1280 Content-Type: text/plane {Binary image data follows} (附錄) 1.HTTP規(guī)范:Internet工程制定組織(IETF)發(fā)布的RFC指定Internet標(biāo)準(zhǔn),,這些RFC被Internet研究發(fā)展機(jī)構(gòu)廣泛接受,。因?yàn)樗鼈兪菢?biāo)準(zhǔn)文檔,,故一般用正規(guī)語言編寫,,如立法文標(biāo)一樣。 2.RFC:RFC一旦被提出,,就被編號且不會(huì)再改變,當(dāng)一個(gè)標(biāo)準(zhǔn)被修改時(shí),,則給出一個(gè)新的RFC,。作為標(biāo)準(zhǔn),RFC在Internet上被廣泛采用,。 3.HTTP的幾個(gè)重要RFC: RFC1945 HTTP 1.0 描述 RFC2068 HTTP 1.1 初步描述 RFC2616 HTTP 1.1 標(biāo)準(zhǔn) 4.資源標(biāo)識符URI(Uniform Resource Identifter,,URI) HTTP參考 一,、HTTP碼應(yīng)碼 響應(yīng)碼由三位十進(jìn)制數(shù)字組成,它們出現(xiàn)在由HTTP服務(wù)器發(fā)送的響應(yīng)的第一行,。 響應(yīng)碼分五種類型,,由它們的第一位數(shù)字表示: 1.1xx:信息,請求收到,,繼續(xù)處理 2.2xx:成功,,行為被成功地接受、理解和采納 3.3xx:重定向,,為了完成請求,,必須進(jìn)一步執(zhí)行的動(dòng)作 4.4xx:客戶端錯(cuò)誤,請求包含語法錯(cuò)誤或者請求無法實(shí)現(xiàn) 5.5xx:服務(wù)器錯(cuò)誤,,服務(wù)器不能實(shí)現(xiàn)一種明顯無效的請求 下表顯示每個(gè)響應(yīng)碼及其含義: 100 繼續(xù) 101 分組交換協(xié) 200 OK 201 被創(chuàng)建 202 被采納 203 非授權(quán)信息 204 無內(nèi)容 205 重置內(nèi)容 206 部分內(nèi)容 300 多選項(xiàng) 301 永久地傳送 302 找到 303 參見其他 304 未改動(dòng) 305 使用代理 307 暫時(shí)重定向 400 錯(cuò)誤請求 401 未授權(quán) 402 要求付費(fèi) 403 禁止 404 未找到 405 不允許的方法 406 不被采納 407 要求代理授權(quán) 408 請求超時(shí) 409 沖突 410 過期的 411 要求的長度 412 前提不成立 413 請求實(shí)例太大 414 請求URI太大 415 不支持的媒體類型 416 無法滿足的請求范圍 417 失敗的預(yù)期 500 內(nèi)部服務(wù)器錯(cuò)誤 501 未被使用 502 網(wǎng)關(guān)錯(cuò)誤 503 不可用的服務(wù) 504 網(wǎng)關(guān)超時(shí) 505 HTTP版本未被支持 二,、HTTP頭標(biāo) 頭標(biāo)由主鍵/值對組成。它們描述客戶端或者服務(wù)器的屬性,、被傳輸?shù)馁Y源以及應(yīng)該實(shí)現(xiàn)連接,。 四種不同類型的頭標(biāo): 1.通用頭標(biāo):即可用于請求,也可用于響應(yīng),,是作為一個(gè)整體而不是特定資源與事務(wù)相關(guān)聯(lián),。 2.請求頭標(biāo):允許客戶端傳遞關(guān)于自身的信息和希望的響應(yīng)形式。 3.響應(yīng)頭標(biāo):服務(wù)器和于傳遞自身信息的響應(yīng),。 4.實(shí)體頭標(biāo):定義被傳送資源的信息,。即可用于請求,也可用于響應(yīng),。 頭標(biāo)格式:<name>:<value><CRLF> 下表描述在HTTP/1.1中用到的頭標(biāo) Accept 定義客戶端可以處理的媒體類型,,按優(yōu)先級排序; 在一個(gè)以逗號為分隔的列表中,,可以定義多種類型和使用通配符,。例如:Accept: image/jpeg,image/png,*/* Accept-Charset 定義客戶端可以處理的字符集,按優(yōu)先級排序,; 在一個(gè)以逗號為分隔的列表中,,可以定義多種類型和使用通配符。例如:Accept-Charset: iso-8859-1,*,utf-8 Accept-Encoding 定義客戶端可以理解的編碼機(jī)制,。例如:Accept-Encoding:gzip,compress 請用此頭標(biāo)可以向服務(wù)器請求壓縮后的數(shù)據(jù)(需要服務(wù)器支持),,下面是使用AAuto模擬的一個(gè)實(shí)例: //gzip解壓縮 Accept-Language 定義客戶端樂于接受的自然語言列表。例如:Accept-Language: en,de
Accept-Ranges 一個(gè)響應(yīng)頭標(biāo),,它允許服務(wù)器指明:將在給定的偏移和長度處,,為資源組成部分的接受請求,。 該頭標(biāo)的值被理解為請求范圍的度量單位。例如Accept-Ranges: bytes或Accept-Ranges: none Age 允許服務(wù)器規(guī)定自服務(wù)器生成該響應(yīng)以來所經(jīng)過的時(shí)間長度,,以秒為單位,。 該頭標(biāo)主要用于緩存響應(yīng)。例如:Age: 30 Allow 一個(gè)響應(yīng)頭標(biāo),,它定義一個(gè)由位于請求URI中的次源所支持的HTTP方法列表,。例如:Allow: GET,PUT aUTHORIZATION 一個(gè)響應(yīng)頭標(biāo),用于定義訪問一種資源所必需的授權(quán)(域和被編碼的用戶ID與口令),。 例如:Authorization: Basic YXV0aG9yOnBoaWw= Cache-Control 一個(gè)用于定義緩存指令的通用頭標(biāo),。例如:Cache-Control: max-age=30 Connection 一個(gè)用于表明是否保存socket連接為開放的通用頭標(biāo)。例如:Connection: close或Connection: keep-alive Content-Base 一種定義基本URI的實(shí)體頭標(biāo),,為了在實(shí)體范圍內(nèi)解析相對URLs,。 如果沒有定義Content-Base頭標(biāo)解析相對URLs,使用Content-Location URI(存在且絕對)或使用URI請求,。 例如:Content-Base: Http://www. Content-Encoding 一種介質(zhì)類型修飾符,,標(biāo)明一個(gè)實(shí)體是如何編碼的。例如:Content-Encoding: zip Content-Language 用于指定在輸入流中數(shù)據(jù)的自然語言類型,。例如:Content-Language: en Content-Length 指定包含于請求或響應(yīng)中數(shù)據(jù)的字節(jié)長度,。例如:Content-Length:382 Content-Location 指定包含于請求或響應(yīng)中的資源定位(URI)。 如果是一絕,。對URL它也作為被解析實(shí)體的相對URL的出發(fā)點(diǎn),。 例如:Content-Location: http://www./news Content-MD5 實(shí)體的一種MD5摘要,用作校驗(yàn)和,。 發(fā)送方和接受方都計(jì)算MD5摘要,,接受方將其計(jì)算的值與此頭標(biāo)中傳遞的值進(jìn)行比較。 例如:Content-MD5: <base64 of 128 MD5 digest> Content-Range 隨部分實(shí)體一同發(fā)送,;標(biāo)明被插入字節(jié)的低位與高位字節(jié)偏移,,也標(biāo)明此實(shí)體的總長度。 例如:Content-Range: 1001-2000/5000 Contern-Type 標(biāo)明發(fā)送或者接收的實(shí)體的MIME類型,。例如:Content-Type: text/html Date 發(fā)送HTTP消息的日期,。例如:Date: Mon,10PR 18:42:51 GMT ETag 一種實(shí)體頭標(biāo),它向被發(fā)送的資源分派一個(gè)唯一的標(biāo)識符,。 對于可以使用多種URL請求的資源,,ETag可以用于確定實(shí)際被發(fā)送的資源是否為同一資源。 例如:ETag: ”208f-419e-30f8dc99″ Expires 指定實(shí)體的有效期,。例如:Expires: Mon,05 Dec 2008 12:00:00 GMT Form 一種請求頭標(biāo),,給定控制用戶代理的人工用戶的電子郵件地址。例如:From: webmaster@ Host 被請求資源的主機(jī)名。對于使用HTTP/1.1的請求而言,,此域是強(qiáng)制性的,。例如:Host: www. If-Modified-Since 如果包含了GET請求,導(dǎo)致該請求條件性地依賴于資源上次修改日期,。 如果出現(xiàn)了此頭標(biāo),,并且自指定日期以來,此資源已被修改,,應(yīng)該反回一個(gè)304響應(yīng)代碼,。 例如:If-Modified-Since: Mon,10PR 18:42:51 GMT If-Match 如果包含于一個(gè)請求,指定一個(gè)或者多個(gè)實(shí)體標(biāo)記,。只發(fā)送其ETag與列表中標(biāo)記區(qū)配的資源。 例如:If-Match: ”208f-419e-308dc99″ If-None-Match 如果包含一個(gè)請求,,指定一個(gè)或者多個(gè)實(shí)體標(biāo)記,。資源的ETag不與列表中的任何一個(gè)條件匹配,操作才執(zhí)行,。 例如:If-None-Match: ”208f-419e-308dc99″ If-Range 指定資源的一個(gè)實(shí)體標(biāo)記,,客戶端已經(jīng)擁有此資源的一個(gè)拷貝。必須與Range頭標(biāo)一同使用,。 如果此實(shí)體自上次被客戶端檢索以來,,還不曾修改過,那么服務(wù)器只發(fā)送指定的范圍,,否則它將發(fā)送整個(gè)資源,。 例如:Range: byte=0-499<CRLF>If-Range:”208f-419e-30f8dc99″ If-Unmodified-Since 只有自指定的日期以來,被請求的實(shí)體還不曾被修改過,,才會(huì)返回此實(shí)體,。 例如:If-Unmodified-Since:Mon,10PR 18:42:51 GMT Last-Modified 指定被請求資源上次被修改的日期和時(shí)間。例如:Last-Modified: Mon,10PR 18:42:51 GMT Location 對于一個(gè)已經(jīng)移動(dòng)的資源,,用于重定向請求者至另一個(gè)位置,。 與狀態(tài)編碼302(暫時(shí)移動(dòng))或者301(永久性移動(dòng))配合使用。 例如:Location: http://www2./index.jsp Max-Forwards 一個(gè)用于TRACE方法的請求頭標(biāo),,以指定代理或網(wǎng)關(guān)的最大數(shù)目,,該請求通過網(wǎng)關(guān)才得以路由。 在通過請求傳遞之前,,代理或網(wǎng)關(guān)應(yīng)該減少此數(shù)目,。例如:Max-Forwards: 3 Pragma 一個(gè)通用頭標(biāo),它發(fā)送實(shí)現(xiàn)相關(guān)的信息,。例如:Pragma: no-cache Proxy-Authenticate 類似于WWW-Authenticate,,便是有意請求只來自請求鏈(代理)的下一個(gè)服務(wù)器的認(rèn)證。 例如:Proxy-Authenticate: Basic realm-admin Proxy-Proxy-Authorization 類似于授權(quán),但并非有意傳遞任何比在即時(shí)服務(wù)器鏈中更進(jìn)一步的內(nèi)容,。 例如:Proxy-Proxy-Authorization: Basic YXV0aG9yOnBoaWw= Public 列表顯示服務(wù)器所支持的方法集,。例如:Public: OPTIONS,MGET,MHEAD,GET,HEAD Range 指定一種度量單位和一個(gè)部分被請求資源的偏移范圍。例如:Range: bytes=206-5513 Refener 一種請求頭標(biāo)域,,標(biāo)明產(chǎn)生請求的初始資源,。對于HTML表單,它包含此表單的Web頁面的地址,。 例如:Refener: http://www./news/search.html Retry-After 一種響應(yīng)頭標(biāo)域,,由服務(wù)器與狀態(tài)編碼503(無法提供服務(wù))配合發(fā)送,以標(biāo)明再次請求之前應(yīng)該等待多長時(shí)間,。 此時(shí)間即可以是一種日期,,也可以是一種秒單位。例如:Retry-After: 18 Server 一種標(biāo)明Web服務(wù)器軟件及其版本號的頭標(biāo),。例如:Server: Apache/2.0.46(Win32) Transfer-Encoding 一種通用頭標(biāo),,標(biāo)明對應(yīng)被接受方反向的消息體實(shí)施變換的類型。例如:Transfer-Encoding: chunked Upgrade 允許服務(wù)器指定一種新的協(xié)議或者新的協(xié)議版本,,與響應(yīng)編碼101(切換協(xié)議)配合使用,。 例如:Upgrade: HTTP/2.0 User-Agent 定義用于產(chǎn)生請求的軟件類型(典型的如Web瀏覽器)。 例如:User-Agent: Mozilla/4.0(compatible; MSIE 5.5; Windows NT; DigExt) Vary 一個(gè)響應(yīng)頭標(biāo),,用于表示使用服務(wù)器驅(qū)動(dòng)的協(xié)商從可用的響應(yīng)表示中選擇響應(yīng)實(shí)體,。例如:Vary: * Via 一個(gè)包含所有中間主機(jī)和協(xié)議的通用頭標(biāo),用于滿足請求,。例如:Via: 1.0 fred.com, 1.1 wilma.com Warning 用于提供關(guān)于響應(yīng)狀態(tài)補(bǔ)充信息的響應(yīng)頭標(biāo),。例如:Warning: 99 www. Piano needs tuning www-Authenticate 一個(gè)提示用戶代理提供用戶名和口令的響應(yīng)頭標(biāo),與狀態(tài)編碼401(未授權(quán))配合使用,。響應(yīng)一個(gè)授權(quán)頭標(biāo),。 例如:www-Authenticate: Basic realm=zxm.mgmt AAuto HTTP開發(fā)實(shí)例: //創(chuàng)建whttp對象 當(dāng)然, AAuto已經(jīng)將上面的代碼封裝為傻瓜化的函數(shù)。
僅需要一句代碼就可以下載指定的文件 var data = inet.whttp().get("http://www.") inet.http 的用法與 inet.whttp 的用法完全一樣, AAuto很多支持庫用法都非常接近, 所以學(xué)習(xí) AAuto 獲得的回報(bào)很棒. inet.http 用于一般的http操作,與客戶端瀏覽器更接近(雖然沒有界面) 例如他可以更好的支持持久化cookie. inet.whttp 則擁有更好的性能和穩(wěn)定性,可以用于長久運(yùn)行的NT服務(wù)程序開發(fā) 關(guān)于這一點(diǎn),可以參考微軟MSDN,AAuto中的inet.http庫也就是WINInet函數(shù)的封裝, 而 inet.whttp 則是 WinHTTP 接口的封裝 作者: 神碼 時(shí)間: 2012-4-1 20:29 標(biāo)題: 標(biāo)準(zhǔn)庫中支持?jǐn)帱c(diǎn)續(xù)傳的 inet.httpFile 源碼 //httpFile 下載文件
namespace inet class httpFile { ctor( url,path,cfg ){ this.url = url; this.file = ..io.open(path,"a+b" ) if(!this.file) error( '創(chuàng)建文件失敗\n請指定正確的存儲(chǔ)路徑' ); if(!cfg){ cfg = path + ".dowload" } } download = function( headers,referer,accept,flags,postData){ method = postData?"POST":"GET" this.file.seek("end") var fileSize = this.file.seek(); var rangeInfoOld; var http = self.http(); if(!http.beginRequest(this.url,method,referer,accept,flags) ){ this.file.close(); http.close(); return null,"請求失敗"; } http.writeHeader(headers) if( fileSize > 0 ) { if( ..io.exist(cfg,4) ) { var content = ..string.load( cfg ); if( content ){ rangeInfoOld = eval( content ) ; //if( rangeInfoOld.acceptRanges ? ..string.cmp( rangeInfoOld.acceptRanges,"bytes" ) == 0 ) { http.writeHeaderRange(rangeInfoOld,fileSize) //} } } } var ok; ok,err,errCode = http.send(postData) if(!ok){ this.file.close(); http.close(); return null,err,errCode } this.statusCode = err; this.contentLength = errCode; //保存一次斷點(diǎn)續(xù)傳配置 var rangeInfoNew = http.readHeaderRange() if( this.statusCode == 200 ){ //如果需要重新下載,存儲(chǔ)相關(guān)信息,清除原來的文件 if( fileSize>0 && rangeInfoOld ){ if( ! this.contentLength || ( ( rangeInfoNew.eTag == rangeInfoOld.eTag) && ( this.contentLength == fileSize) ) ){ http.close() this.file.close() return true,"已下載完成, 無須重新下載!",fileSize } } if(fileSize!=0){ this.file.close(); this.file = ..io.open(path,"w+b" ) } rangeInfoNew.contentLength = this.contentLength fileSize = 0; } elseif( this.statusCode == 206 ) { rangeInfoNew.contentLength = this.contentLength + fileSize } elseif( this.statusCode == 416 ){ this.file.close(); http.close() if( this.contentLength == 0 ){ return true,"已下載完成, 無須重新下載!",fileSize } return null,"下載遇到錯(cuò)誤, HTTP狀態(tài)碼:" + this.statusCode; } else { this.file.close(); return null,"下載遇到錯(cuò)誤, HTTP狀態(tài)碼:" + this.statusCode; } ..string.save(cfg,..table.tostring(rangeInfoNew) ) //開始下載 if(this.onRecive){ if( this.onReciveBegin ) this.onReciveBegin( this.statusCode,this.contentLength,fileSize ) var total = this.contentLength for(str,size in http.eachRead() ){ this.file.write(str) if( this.onRecive( str,size,total ) === false ){ this.file.flush(); this.file.close(); http.close(); return false; } } } else { for(str,size in http.eachRead() ){ this.file.write(str) } } this.file.flush(); this.file.close(); http.close(); return true,,this.contentLength; } } namespace httpFile{ http = ..inet.http : ..inet.whttp; if(!http){ error('請?jiān)趯?dǎo)入inet.file以前\n導(dǎo)入 inet.http 或 inet.whttp ',2) } } 作者: 神碼 時(shí)間: 2012-4-1 20:30 標(biāo)題: 斷點(diǎn)續(xù)傳范例 //創(chuàng)建下載對話框
import win.ui; /*DSG{{*/ var winform = win.form( bottom=110;parent=...;right=425;text="AAuto Form" ) winform.add( button={ bottom=76;right=350;left=191;top=38;z=1;text="下載";cls="button" } ) /*}}*/ import inet.downBox; winform.button.oncommand = function(id,event){ var downBox = inet.downBox(winform,"下載測試網(wǎng)頁...") downBox.endProc = function(ret,fileSize,err){ if(!err) owner.endModal(); } downBox.download( "http://www./public/aauto/lib/java.cab" , ..fsys.joinpath(..io._exedir,"/download/lib/java.cab") ) } winform.show() win.loopMessage(); 作者: 神碼 時(shí)間: 2012-4-1 20:31 標(biāo)題: 斷點(diǎn)續(xù)傳演示 //斷點(diǎn)續(xù)傳演示
import fsys; import inet.http import inet.httpFile; io.open() var remoteFile = inet.httpFile( "http://www./public/aauto/lib/tcc.cab" , ..fsys.joinpath(..io._exedir,"/download/lib/tcc.cab") ) remoteFile.onReciveBegin = function(statusCode,contentLength,fileSize){ if( statusCode == 206/*斷點(diǎn)續(xù)傳*/ ){ io.print("正在斷點(diǎn)續(xù)傳") } elseif(fileSize){ io.print("正在重新下載") } io.print("未下載長度",contentLength,"已下載長度",fileSize, "HTTP狀態(tài)碼", statusCode ) } remoteFile.onRecive = function(str,size,contentLength){ io.print("總長度",contentLength , "下載", size ) //return false; //返回false停止下載 } //下載文件 var ok,fileSize,err = remoteFile.download() io.print( ok,fileSize,err,inet.lastResponse() ) 作者: 神碼 時(shí)間: 2012-4-1 20:32 標(biāo)題: HTTP文件流方式上傳 //HTTP文件流方式上傳
import process import inet.http io.open() http = inet.http( ); http.beginRequest( "http://www./ape/test/post.asp" ); //循環(huán)上傳 http.beginSendData(1000) for(i=1;1000;1){ http.writeData( tostring(i) ) } http.endSendData() //循環(huán)下載 file = io.open("/test.html","w+b") for(str,size in http.eachRead() ){ file.write( str ); } io.print("ok") 作者: 神碼 時(shí)間: 2012-4-1 20:36 標(biāo)題: FTP文件流讀寫 //FTP文件流讀寫
io.open(); import inet.ftp; ftp = inet.ftp("服務(wù)器IP","用戶名","密碼"); if(!ftp){ ..io.print("請輸入正確的服務(wù)器參數(shù)"); return; } //顯示當(dāng)前目錄 io.print( ftp.getCurDir() ) //關(guān)閉服務(wù)器UTF8編碼 ftp.command("OPTS UTF8 off") file = ftp.open("/目錄/文件名.txt","wb") //支持文件流方式上傳數(shù)據(jù),使用循環(huán)即可控制上傳進(jìn)度 file.write("寫數(shù)據(jù)","寫更多數(shù)據(jù)",'\r\n') file.write("寫數(shù)據(jù)","寫更多數(shù)據(jù)",'\r\n') ftp.close() 附注:以上所有代碼來自AAuto標(biāo)準(zhǔn)庫,及范例,。 無論是 HTTP,WHTTP,FTP, 底層用法都非常復(fù)雜,,實(shí)現(xiàn)控制自如的效果都非常困難,而用各函數(shù)的用法也各自不同,, AAuto將這一切都進(jìn)行了封裝,并進(jìn)行簡化,,提供了非常簡單,,并幾近一致的接口,。 最重要的是,,這些都完全重用了系統(tǒng)提供的API,不需要第三方庫,,所以你可以自由的使用上面的功能,,而且你的程序?qū)?huì)非常小。而對于互聯(lián)網(wǎng)桌面軟件,,size則是必須重視的一個(gè)開發(fā)重點(diǎn),。 |
|