




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、在J2ME网络程序开发过程中,为了节约用户支付的网络费用,很多J2ME手机网络程序都支持CMWAP代理。但是由于CMWAP只是中国移动建立的一个HTTP网络服务器,所以在使用HTTP网络编程中,可以很方便的使用。但是在使用socket方法操作时,这个方式好象就行不通了。下面就介绍一下如何使用socket连接来穿越CMWAP代理。其实由于CMWAP是一个标准的HTTP代理服务器,也就是说可以处理任何的基于HTTP协议的转发请求,那么就可以使用socket方式编程时使用HTTP协议即可了。实现原理:使用socket和CMWAP建立连接,然后将网络协议设计成HTTP协议的格式,这样CMWAP就可以继
2、续实现请求的转发了,这就是实现的基本原理。当然,由于socket连接方式可以实现持续连接,这里的持续连接只存在于手机和CMWAP之间,但是可以只建立一次连接就实现多次的发送,还是基于请求-响应结构实现的,所以可以说实现了一部分socket的功能,而服务器端可以采用已有的HTTP服务器,从而降低开发成本和时间。该技术的优势主要有以下几点:u 使用CMWAP进行数据传输,可以为用户节约流量费用。u 由于手机和CMWAP之间建立的是持续连接,所以可以提高网络
3、响应速度。u 使用该方式,可以实现服务器端兼容HTTP连接和socket连接,也就是使用一组服务器,降低开发成本和减少开发时间。实现网络操作的代码如下所示:package cmwaptest;import java.io.*;import javax.microedition.io.*;/* * 测试使用socket连接穿越CMWAP服务器 */public class CmwapThread extends Thread CmwapForm cf; public CmwapThread(CmwapForm cf) thi
4、s.cf = cf; public void run() try /测试 cf.displayInfo("开始建立连接!"); /使用代理连接 SocketConnection sc = (SocketConnection)Connector.open("socket:/72:80"); /测试 cf.displayInfo("连接建立完毕!"); /发送数据 OutputStream os = sc.openOutputStream(); String requestLine = "
5、;get http/1.0rn" String header = "accept:*/*rnrn" os.write(requestLine.getBytes(); os.write(header.getBytes(); os.flush(); /测试 cf.displayInfo("数据发送完毕!"); /接收数据 InputStream is = sc.openInputStream(); byte data = new byte10240; int num = is.read(data); /测试 cf
6、.displayInfo("数据接受完毕!" + "数据长度为:"+ num); /处理数据 cf.doStr(data,num); sc.close(); catch(Exception e) /e.printStackTrace(); cf.doError(e.toString(); 请问一下你的实测结果如何? 我的实测环境是:服务器采用tomcat+servlet,手机是motorola e398,实测结果如下: 1、关于第一点,如果用HttpConnection的GET方式收只有一个字符a的网页流量是1101,SocketConnec
7、tion是929,我想这是HttpConnection底层实现添加了一些http头的原因。 2、关于第二点,wap网关会自动添加“connection: close”,如果是http服务器,也会相应返回这个标志并关闭链接(这点在rfc2616中也有说明)。所以说想持续连接是不太可能的,如果自己写一个服务器来解析HTTP,忽略这个标志会如何,这些我就没有试了。:)to alien75 : 首先感谢你的实际测试。 关于你提到的问题,解释如下: 1、关于这个流量问题,你可以控制客户端以及服务器端的头信息数量来达到控制流量的目的,而且CMWAP的收费可以包月,这个是CMNET无法比拟的。 2、通过这种
8、方式实现的是半持续的连接,也就是只有手机和CMWAP直接是以socket进行连接,所以是持续的,而CMWAP和服务器之间使用的是HTTP连接,这个是每次需要重新建立的。但是HTTP编程最大的延迟来自于重新建立连接,所以使用该方式传输数据虽然无法利用过多的socket特性,但是可以在节约费用的同时,实现响应速度的提高。 最后补充一点,该种技术只是一种过渡技术,随着socket的普及以及费用的降低,这种技术会被淘汰。更正一点,我不是取的网页,而是在servlet中直接用输入输出流来做的。to mailbomb: 多谢你的用时回复 针对你的第二点说明,我做了一个简单测试。还是相同的测试环境和测试数据
9、,做了两种测试。结果如下: 1、检测数据负载效率。每隔5秒发一个请求,20次后流量是11852。如果是HTTP方式,每一次事务请求从发起到完成都要大概1K吧。 2、检测手机多长时间不发数据WAP网关会断开链接。我是通过发送抛出异常来判断,发现这个值是25秒左右。测试时间是上午10点,而且我觉得这个值与各地的网关类型以及高峰时段应该有关连,所以只能做为一个参考值。因此象那种想利用现有连接发送的数据间隔不能太长,否则还是要重连的。 由此看来这种方式在目前是可行的,不知道3G出来后,CMCC会不会开放SOCKET? 在此再恶一把CMCC,就咱中国还分个什么CMNET和CMWAP,也算是中国特色吧。
10、_/使用代理连接 SocketConnection sc = (SocketConnection)Connector.open("socket:/72:80"); 之后,如何连接到我的url服务器? 返回的消息是不是可以保证完整性?to orient : 其实CMWAP是一个HTTP代理服务器,所以你的URL地址包含在发送过去的协议数据中,如代码: String requestLine = "get http/1.0rn" 这里是发送到的地址非常感激你的回复。 因为我要模仿cmnet连接,那么协议数据中每次都有URL地址,同时我的消息(b
11、yte 形式)也放在里边么? 代理服务器(cmwap)如何转发我的消息(byte 形式)到我的指定服务器。 因为你的String requestLine = "get http/1.0rn" 是get连接方式么。 如果方便,请你留下MSN。我的是jadyorient可以写一个post 连接的例子么。 呵 URL: static final String HOST = "03" static final int TCP_PORT = 9002; 我登陆平台时 发送消息 : 其中类型(short),账号(short),密码3项(st
12、ring)。 服务器返回消息: 其中类型(short),ok (byte)。 手机6600。to orient : 只需要做如下更改即可: String requestLine = "post 03:9002 http/1.0rn" 你的协议部分可以写入实体数据部分即可使用Socket连接穿越CMWAP代理作者:陈跃峰出自:版权所有,未经允许严禁转载! 在J2ME网络程序开发过程中,为了节约用户支付的网络费用,很多J2ME手机网络程序都支持CMWAP代理。但是由于CMWAP只是中国移动建立的一个HTTP网络服务器,所以在使用H
13、TTP网络编程中,可以很方便的使用。但是在使用socket方法操作时,这个方式好象就行不通了。下面就介绍一下如何使用socket连接来穿越CMWAP代理。其实由于CMWAP是一个标准的HTTP代理服务器,也就是说可以处理任何的基于HTTP协议的转发请求,那么就可以使用socket方式编程时使用HTTP协议即可了。实现原理:使用socket和CMWAP建立连接,然后将网络协议设计成HTTP协议的格式,这样CMWAP就可以继续实现请求的转发了,这就是实现的基本原理。当然,由于socket连接方式可以实现持续连接,这里的持续连接只存在于手机和CMWAP之间,但是可以只建立一次连接就实现多次的发送,还
14、是基于请求-响应结构实现的,所以可以说实现了一部分socket的功能,而服务器端可以采用已有的HTTP服务器,从而降低开发成本和时间。该技术的优势主要有以下几点:u 使用CMWAP进行数据传输,可以为用户节约流量费用。u 由于手机和CMWAP之间建立的是持续连接,所以可以提高网络响应速度。u 使用该方式,可以实现服务器端兼容HTTP连接和socket连接,也就是使用一组服务器,降低
15、开发成本和减少开发时间。实现网络操作的代码如下所示:package cmwaptest;import java.io.*;import javax.microedition.io.*;/* * 测试使用socket连接穿越CMWAP服务器 */public class CmwapThread extends Thread CmwapForm cf; public CmwapThread(CmwapForm cf) this.cf = cf; public void run() try /测试 cf.displayInfo("开始建立连接!"); /使用代理连接
16、 SocketConnection sc = (SocketConnection)Connector.open("socket:/72:80"); /测试 cf.displayInfo("连接建立完毕!"); /发送数据 OutputStream os = sc.openOutputStream(); String requestLine = "get http/1.0rn" String header = "accept:*/*rnrn" os.write(requestLine.getBytes(); os.write(header.getBytes(); os.flush(); /测试 cf.displayInfo("数据发送完毕!"); /接收数据 InputStre
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论