簡單介紹 symian http

 最近一直做symbian http上傳下載項目,在幾個問題上面繞了個大彎,耽誤了好長時間,現總結一下遇到的問題以及解決方法,爲己爲人.簡單介紹一下基礎知識.
1)    GRPS接入方式:
CMNET和CMWAP是中國移動GPRS網絡的兩個不同APN(Access Point Name接入點名稱)。CMNET提供了NAT服務,使用該服務的手機可以直接訪問internet。CMWAP只提供了WAP代理和HTTP代理,手機 上網能訪問的範圍有限,接入時只能訪問GPRS網絡內的IP(10,*,*,*)。因此CMWAP主要用於手機WAP上網,CMNET則是用於PC,筆記 本電腦,PDA等設備實現GPRS上網。兩者手機上網的方式沒有差別,如此劃分是中國移動對手機上網服務對象的定位不同,所以他們的應用範圍和資費標準不 同。
2) CMNET和CMWAP區別:
A:CMWAP只開放80,8080,9201端口,適合http,wap訪問(10.0.0.172起初是做爲CSD方式的無線接入的網關,那時使用的 是9201端口,運行的是WAP(Wireless Access Protocal)一種專門的無線終端訪問數據網絡的衉議。它的作用其實更多的是作爲Mobile Network和Internet之間的網關,將無線終端的WAP address請求遞交給DNS解析,然後重定向至WAP站點。
進入GPRS時代後10.0.0.172開始作爲proxy使用開放了80端口,仍然承載WAP並開始提供更多的服務,例如:MMS和HTTP。手機這時其實更象是局域網中使用proxy的Internet address上網的設備)
CMNET適合象socket等非http請求訪問.
B: CMNET可以把他想象成PC上的直接連接INTERNET。如果用CMNET接入點,可以直接上INTERNET
CMWAP就相當於PC上的局域網。中國電信只針對CMWAP開放2個端口,就是80和9201,如果CMWAP接入,要連接INTERNET,需要才用HTTP代理協議.
C:費用比較
CMWAP所需要的都是移動網絡內部的流量,成本可以忽略不計算.
CMNET則需要中國移動爲此而支付網間結算費用
D: 訪問內容
用CMWAP只能訪問服務器位於wap網內的網站或者使用提供服務的網站位於wap網內的軟件。例如掌迅通,10game之類。
用CMNET,任何服務,網絡,軟件,都可以自由使用
3)    WAP簡介
   WAP(Wireless Application Protocol)無線應用協議是一個開放式標準協議,它使用一種類似於HTML的標記式語言WML,相當於國際互聯網上的HTML(超文件標記語言)並可通過WAP Gateway直接訪問特定的網頁。
WAP能夠運行於各種無線網絡之上,如GSM、GPRS、CDMA1X等,即將開通的3G移動通信網絡同樣也支持WAP。打個比喻,GPRS和GSM都是馬路,而WAP是在馬路上的汽車,汽車上運輸的貨物,就是WAP上的網站內容了。
   WAP只是一種GPRS應用模式,它與GRPS的接入方式是無關的。WAP應用採用的實現方式是“終端+WAP網關+WAP服務器”的模式
4) symbian開發中遇到的問題:
首先是symbian的字符串問題:
HBufC8* heapBuf = HBufC8::NewLC(fileLength);
TPtr8 postData8 = heapBuf->Des();
file.Read(postData8);
注意: 此處是關鍵,費了一個禮拜,不能把文件直接生成入HBufC8,如HBufC8::NewLC(fileStream, fileLength)也沒法得到,因爲HBufC是不可以修改的, 用 Des() 返回一個可修改的指針TPtr8,然後讀入文件file.Read(TPtr8),symbian沒有提供可供修改的堆描述符HBuf.
   其次是代理設置問題.
    http在symbian真機上走的是CMWAP,需要設置http代理,代理IP地址是:10.0.0.172,端口是:80
    在設置好代理後,發送URL連接,下面是get請求的程序代碼:
         
       TUriParser8 uri;
       uri.Parse(aUri);

TBuf8<20> aProxy8(_L8("10.0.0.172:80"));
       RStringF iPrxAddr = iSession.StringPool().OpenFStringL(aProxy8);
       CleanupClosePushL(iPrxAddr);

       THTTPHdrVal iPrxUsage(iSession.StringPool().StringF(HTTP::EUseProxy,RHTTPSession::GetTable()));
       iSession.ConnectionInfo().SetPropertyL(iSession.StringPool().StringF(HTTP::EProxyUsage,RHTTPSession::GetTable()), iPrxUsage);
       iSession.ConnectionInfo().SetPropertyL(iSession.StringPool().StringF(HTTP::EProxyAddress,RHTTPSession::GetTable()), iPrxAddr);
       CleanupStack:: PopAndDestroy();

       RStringF method = iSession.StringPool().StringF(HTTP::EGET,
             RHTTPSession::GetTable());

       iTransaction = iSession.OpenTransactionL(uri, *this, method);

       RHTTPHeaders hdr = iTransaction.Request().GetHeaderCollection();
//原來的錯誤做法
//    _LIT8(KHost, "10.0.0.172:80");
//    SetHeaderL(hdr, HTTP::EHost, KHost);
//    SetOnLineHostHeader(iPrxAddr); //添加 "X_OnLine_Host"

       SetHeaderL(hdr, HTTP::EUserAgent, KUserAgent);
       SetHeaderL(hdr, HTTP::EAccept, KAccept);

       iTransaction.SubmitL();
籃筆所示爲設置http代理的程序.
呵呵,終於搞定這個http程序了.

注:我的開發環境:symbian 7.0s+vc++6.0

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章