Symbian
真机
http
上传下载文件
Eddy,2007,5,10,
下午
最近一直做
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
测试手机
:NOKIA6670