1.cmwap相关:
cmwap是中国移动提供的浏览服务接入点,正常情况下,只开通HTTP 80端口,所以cmwap不支持socket通信(如果实在需要,需要向中国移动做业务申请,进行网关配置),因此一般的socket通信只能用cmnet(设立初衷针对无线上网)接入点。
2.移动网关的作用
a)移动网关的主要作用是提高访问速度。因为客户请求的数据存于代理服务器的硬盘中,因此下次这个客户或其它客户再请求相同目的站点的数据时,就能直接从代理服务器的硬盘中读取,代理服务器起到了缓存的作用,但缓存却给开发人员造成障碍,如cookie缓存问题等。
b)获取手机用户数据,如手机号码等
3. cmwap实现socket原理:
其实由于CMWAP是一个标准的HTTP代理服务器,也就是说可以处理任何的基于HTTP协议的转发请求,那么就可以使用socket方式编程时使用HTTP协议即可了。
实现原理:使用socket和CMWAP建立连接,然后将网络协议设计成HTTP协议的格式,这样CMWAP就可以继续实现请求的转发了,这就是实现的基本原理。
当然,由于socket连接方式可以实现持续连接,这里的持续连接只存在于手机和CMWAP之间,但是可以只建立一次连接就实现多次的发送,还是基于请求-响应结构实现的,所以可以说实现了一部分socket的功能,而服务器端可以采用已有的HTTP服务器,从而降低开发成本和时间。
该技术的优势主要有以下几点:
a 使用CMWAP进行数据传输,可以为用户节约流量费用。
b 由于手机和CMWAP之间建立的是持续连接,所以可以提高网络响应速度。
c 使用该方式,可以实现服务器端兼容HTTP连接和socket连接,也就是使用一组服务器,降低开发成本和减少开发时间。
4. 测试
经过测试,可以不用HTTP协议进行数据的封装,只要和代理服务器建立连接,发送
CONNECT http://219.137.197.**:3650 HTTP/1.1/r/nHost:219.137.197.90:3650/r/n/r/n 的请求,如果连接成功,服务器返回的信息是 "HTTP/" + 代理版本 + "200" + 描述("Connection established")
.就可以用已经连接的Socket正常的发消息了
环境: 广东,短连接
5,问题:
connect 是 http 1.1 增加的新命令, 用于https, 建立隧道, 可用于穿越gateway, 但是其支持由厂商的实现确定,
你确认移动的wap gateway支持此命令吗, 出于安全考虑, 移动的wap gateway好像是不支持的, 否则, 移动怎么对wap业务进行2次确认, 实现计费?而且移动的不同省使用的wap gateway是不同厂家的产品, 支持也不同, 这种方式最好不要使用, 而且没看出来你这样设计有什么好处
缺点: a.缺少稳定性,
b.数据量大 ,容易丢包,实际意义不大
symbian测试代码:
_LIT(KConnectIP,"10.0.0.172");//移动的cmwap代理网关
const int KConnectPort = 80;//端口
RSocket iSocket;
TRequestStatus iStatus = KRequestPending;
TBuf8<1024> recvBuf;
HBufC8 *iBuffer = NULL;
{
RSocketServ iSocketServ;
User::LeaveIfError(iSocketServ.Connect());
TInetAddr iAddress;
if (iAddress.Input(KConnectIP) == KErrNone)
{
User::LeaveIfError(iSocket.Open(iSocketServ, KAfInet, KSockStream, KProtocolInetTcp));
iAddress.SetPort(KConnectPort);
iStatus = KRequestPending;
iSocket.Connect(iAddress, iStatus);
User::WaitForRequest(iStatus);
TBuf8<1024> sendData1;
sendData1.Append(_L8("CONNECT http://219.137.197.**:3650 HTTP/1.1/r/n")); //开始格式化头
sendData1.Append(_L8("Host: 219.137.197.90:3650/r/n/r/n"));//
iSocket.Write(sendData1,iStatus);
User::WaitForRequest(iStatus);
TBuf8<1024> sendData;
_LIT8(KURL,"GET http://219.137.197.**:3650 Http/1.1/r/n");
_LIT8(KHOST, "Host: 219.137.197.**:3650/r/n");
_LIT8(KOTHERS, "Accept: */*/r/n/r/n");
sendData.Append(KURL);
sendData.Append(_L("X-Online-Host: 219.137.197.**:3650/r/n"));
sendData.Append(KHOST);
sendData.Append(_L8("Connection: Keep-Alive/r/n"));
sendData.Append(KOTHERS);
if (iStatus.Int() ==KErrNone)
{
iStatus = KRequestPending;
iSocket.Write(sendData,iStatus);
User::WaitForRequest(iStatus);
if (iStatus.Int() ==KErrNone)
{
TSockXfrLength iDummyLength;
TInt recvSize = 0;
for(;;)
{
iStatus = KRequestPending;
iSocket.RecvOneOrMore(recvBuf, 0, iStatus, iDummyLength);
User::WaitForRequest(iStatus);
if (iStatus.Int()==KErrNone)
{
recvSize += recvBuf.Length();
if(iBuffer==NULL)
iBuffer = HBufC8::NewL(recvSize);
else
iBuffer = iBuffer->ReAlloc(recvSize);
iBuffer->Des().Append(recvBuf);
}
else
{
break;
}
}
}
}
iSocket.Close();
}
iSocketServ.Close();
}
以上内容皆来自于网络,本人转载只做学习参考用