MTK下,cmwap接入点,socket向服务器发请求数据,收到移动网关重定向后,再发数据就收到CLOSE消息
各位好,目前我在开发手机上的socket通信,碰到一个比较不解的问题(在厦门等城市可以正常收发数据,但在上海测试发现用cmwap获取不到数据就收到CLOSE的消息),若有什么建议给个参考,谢谢了~~手机平台:MTK
GPRS接入点:cmwap
手机上的程序是作为终端,连接到服务器请求数据,移动网关10.0.0.172:80,在发送请求后,会收到:
HTTP/1.1 200 OK
Content-Type: text/vnd.wap.wml; charset=UTF-8
Content-Length: 584
Date: Fri, 18 Sep 2009 06:35:12 GMT
Connection: Close
Proxy-Connection: Close
Via: HTTP/1.1 SHSH-PS-WAP3-GW03(infoX-WISG, Huawei Technologies)
Server: WebLogic Server 8.1 SP3 Tue Jun 29 23:11:19 PDT 2004 404973 with CRs:
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<head>
<meta http-equiv="Cache-Control" content="max-age=0" forua="true"/>
<meta http-equiv="Cache-Control" content="no-cache" forua="true"/>
<meta http-equiv="Cache-Control" content="must-revalidate" forua="true"/>
</head>
<card id="card" title="" >
<onevent type="onenterforward">
<go href="发送请求的地址"></go></onevent>
</card>
</wml>
正常的流程是只要再次发送请求就可以获取服务器发的数据了。但在我发完数据后,还没收到服务器应答,就立马收到CLOSE的消息,这个问题是移动网关主动关闭吗?该如何处理收不到服务器的应答----暂时不考虑用cmnet。
补充一点,在上海测试的时候偶尔会成功获取数据,但发现都是:第一次发完请求后,没有收到网关的那个重定向,而是直接收到服务器的应答的,这个在之前的测试中还没碰到过。
看看各位有没碰到这样的问题,小女子我实在是想不明白啊,谢~~ --------------------编程问答-------------------- 会不会又是network id 的问题呀 --------------------编程问答--------------------
能否说详细点呢?什么是network id ?我的程序需要做什么可以确认是否是这个问题呢? --------------------编程问答-------------------- 我也遇到了这个问题
很奇怪
而且我发现每次再发请求返回的依然是重定向页面(就是在第二次发的请求url后面再加上一个t参数)
谁知道这是为什么
在网上找了个WAP网关功能及业务流程 的文档
http://bbs.cnttr.com/thread-96770-1-1.html
想买他的买不了
真是郁闷了 --------------------编程问答-------------------- 还是没人回答
顶起来啊 --------------------编程问答-------------------- 顶 --------------------编程问答-------------------- MTK技术群,欢迎MTK技术人员进入,共同讨论,一起进步,各各成高手,群号23314660 --------------------编程问答-------------------- 这个页面是移动做的收费提示,具体什么时候会发这个页面,得问移动
以下我猜的
我用的我的测试卡,有时有,有时无,过了一段时间,从没有见过个页面了
但是用一张新卡时,每次发起请求后都会出现这个页面。
我估计移动记录下了我们的手机请求信息,对常发起请求的, 这个页面直接跳过。
对于楼主的问题:
但在我发完数据后,还没收到服务器应答,就立马收到CLOSE的消息,这个问题是移动网关主动关闭吗?
你在程序里不要管CLOSE这个消息,哈哈 --------------------编程问答-------------------- 这个问题我遇见过,现在已经解决了!上海地区的cmwap应用回自动转为cmnet.
所以上海只能用cmnet来接入,否则服务器可以收到你的请求,但它的回应你收不到. --------------------编程问答-------------------- 楼上的怎么解决的啊?具体步骤,俺在深圳 --------------------编程问答-------------------- 我们上海的应用改用cmnet连接,不用cmwap连接. 而且在上海这两个连接收费是一样的. --------------------编程问答-------------------- 这个问题和手机无关,是上海的网关造成的.我用cmwap连接,但是到服务器端看到的结果是通过cmnet连接近来的,服务器通过他接受的端口回应后,手机却得不到响应.手机的连接改为cmnet后,立即测试通过. --------------------编程问答-------------------- 学习了 --------------------编程问答-------------------- 你每次收http包的时候判断下content-type的类型,如果是text/vnd.wap.wml,你就认为是移动的提示信息。如果收到移动的提示信息,你就断掉当前的socket,重新建一个socket来发送你的请求数据即可。
据说(自己还没有验证过),移动会在每个月第一次使用网络时下发提示信息。 --------------------编程问答-------------------- 学习了,深受教育;当初我在做“终端管理”的时候在这里卡了好久,
现在豁然开朗…… --------------------编程问答--------------------
这个可行。
使用cmwap必须重建socket,重发一次数据。
--------------------编程问答-------------------- 1.移动代理服务器
IP:10.0.0.172 port:80
2.MTK socket接口
1)soc_create创建socket接口
2)soc_setsockopt设置socket option
3)soc_connect建立连接,在这里连接的对像是代理服务器10.0.0.172
4)soc_send发送信息
5)soc_recv接收信息
6)非阻塞模式,手机平台通讯都是非阻塞模式,因此soc_connect和soc_recv一般不会马上返回成功,而是返回SOC_WOULDBLOCK.意思是要等待一会儿,.所以我们要调用SetProtocolEventHandler来设置回调函数.
3.http格式
一个的HTTP请求格式如下:
GET http://www.google.cn HTTP/1.1\r\n
Host: www.google.cn\r\n
Proxy-Connection: Keep-Alive\r\n
\r\n
GET后面是请求的文件,Host后面是请求的域名.每行都以\r\n结束.最后还必须有一个空行.一般情况下请求包只有包头,没有包体.
一个的HTTP响应消息格式如下:
HTTP/1.1 200 OK [ZTEOSE]\r\n
Server: ZTEOSE\r\n
Date: Tue, 15 Jul 2008 04:50:08 GMT\r\n
Server: WebLogic Server 8.1 SP3 Tue Jun 29 23:11:19 PDT 2004 404973 with CRs:\r\n
Set-Cookie: jid=L8sQcQ71W0!225012077; path=/\r\n
Content-Length: 494\r\n
Content-Type: text/vnd.wap.wml;charset=UTF-8\r\n
\r\n
(数据....)
通常,移动响应的第一个包是重定向,如下所示:
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<head>
<meta http-equiv="Cache-Control" content="max-age=0" forua="true"/>
<meta http-equiv="Cache-Control" content="no-cache" forua="true"/>
<meta http-equiv="Cache-Control" content="must-revalidate" forua="true"/>
</head>
<card id="card" title="" >
<onevent type="onenterforward">
<go href="http://www.google.cn:80/?t=08458"></go></onevent>
</card>
</wml>
其中http://www.google.cn:80/?t=08458就是要重定向的URL,客户端接到这个包之后要重新发一个请求包,而且把
GET http://www.google.cn HTTP/1.1\r\n
改成:
GET http://www.google.cn:80/?t=08458 HTTP/1.1\r\n
之后就能得到想要的数据了
--------------------编程问答-------------------- 用这种方法行 --------------------编程问答-------------------- 在http请求中加一个X-Online-Host的字段即可 --------------------编程问答-------------------- 以上方法都试过了 除了用CMNET可行外 其他都不行啊 --------------------编程问答-------------------- GET www.google.cn:80/?t=08458 HTTP/1.1
Host: 10.0.0.172
X-Online-Host:www.google.cn
Proxy-Connection: Keep-Alive
这样不行吗? --------------------编程问答-------------------- 顶!学习中 --------------------编程问答-------------------- 跟楼主有同样的疑问啊,研究好久天了都没有搞定,杯具啊!!
通过收的的重定向网址再发送请求也是行不通的,怎么搞呢? --------------------编程问答-------------------- 我也是同样的问题呀..跟楼主遇到的情况一样...
SOCKET时,IP指定为移动WAP代理IP(10.0.0.172)
GET / HTTP/1.1\r\n
Host:10.0.0.172\r\n
X-Online-Host:www.google.com\r\n\r\n
这种写法,都没有返回的数据啊
而我改写成GET / HTTP/1.1\r\n
HOST:www.google.com\r\n\r\n
时,有数据返回,但是无用的数据..哪位高手来解决下 --------------------编程问答-------------------- 楼主这种问题应该是移动做了限制,尤其是在大城市数据业务比较繁忙的情况下,解决办法是减小每次发送包大小,这个包是指socket 发送一次的数据量不能太多,根据经验大概是不要超过2k,同时两次间隔时间不能太短,上海这种地方一般在半夜时会比较顺畅; --------------------编程问答-------------------- 试试
GET http://www.google.com/ HTTP/1.1\r\n
Host:10.0.0.172:80\r\n
--------------------编程问答-------------------- 我也有这个问题,第一次连接ok的,然后自动给你断开 --------------------编程问答-------------------- 09年的帖子还有人回复啊
我一直搞不懂 apn(cmnet cmwap...) 到底在哪存放着?nv 里还是sim卡内? --------------------编程问答-------------------- CMWAP是移动的彩信服务器,也就是说你要用CMWAP的APN
那么服务器也要用CMWAP的服务器才行
所以还是用CMNET吧,一般的手机卡CMNET和CMWAP都是有开通的
补充:移动开发 , 移动开发其他问题