`
xuechenyoyo
  • 浏览: 55669 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

转载-陈跃峰的J2ME博客

    博客分类:
  • J2ME
阅读更多

转载-原博客:http://blog.csdn.net/mailbomb/archive/2006/04/24/674736.aspx

感谢陈跃峰的J2ME博客!

            原文:

       在J2ME网络程序开发过程中,为了节约用户支付的网络费用,很多J2ME手机网络程序都支持CMWAP代理。

       但是由于CMWAP只是中国移动建立的一个HTTP网络服务器,所以在使用HTTP网络编程中,可以很方便的使用。但是在使用socket方法操作时,这个方式好象就行不通了。

       下面就介绍一下如何使用socket连接来穿越CMWAP代理。其实由于CMWAP是一个标准的HTTP代理服务器,也就是说可以处理任何的基于HTTP协议的转发请求,那么就可以使用socket方式编程时使用HTTP协议即可了。

       实现原理:使用socket和CMWAP建立连接,然后将网络协议设计成HTTP协议的格式,这样CMWAP就可以继续实现请求的转发了,这就是实现的基本原理。

       当然,由于socket连接方式可以实现持续连接,这里的持续连接只存在于手机和CMWAP之间,但是可以只建立一次连接就实现多次的发送,还是基于请求-响应结构实现的,所以可以说实现了一部分socket的功能,而服务器端可以采用已有的HTTP服务器,从而降低开发成本和时间。

       该技术的优势主要有以下几点:

     使用CMWAP进行数据传输,可以为用户节约流量费用。

       由于手机和CMWAP之间建立的是持续连接,所以可以提高网络响应速度。

      使用该方式,可以实现服务器端兼容HTTP连接和socket连接,也就是使用一组服务器,降低开发成本和减少开发时间。

       实现网络操作的代码如下所示:

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("开始建立连接!");

            //使用代理连接

            SocketConnection sc = (SocketConnection)Connector.open("socket://10.0.0.172:80");



            //测试

            cf.displayInfo("连接建立完毕!");

            //发送数据

            OutputStream os = sc.openOutputStream();

            String requestLine = "get http://www.freewebs.com/cqucyf/a.htm http/1.0\r\n";

            String header = "accept:*/*\r\n\r\n";



            os.write(requestLine.getBytes());

            os.write(header.getBytes());

            os.flush();



            //测试

            cf.displayInfo("数据发送完毕!");



            //接收数据

            InputStream is = sc.openInputStream();

            byte[] data = new byte[10240];

            int num = is.read(data);

            //测试

            cf.displayInfo("数据接受完毕!" + "数据长度为:"+ num);

            //处理数据

            cf.doStr(data,num);



            sc.close();

        }catch(Exception e){

            //e.printStackTrace();

            cf.doError(e.toString());

        }

    }

}

发表于 @ 2006年04月24日 11:23:00|评论(26)

新一篇: J2ME入门培训专用网站发布 | 旧一篇: J2ME入门培训概述mailbomb 发表于2006年4月24日 17:20:00  IP:举报
希望大家积极拍砖!alien75 发表于2006年4月24日 19:42:00  IP:举报
请问一下你的实测结果如何?
我的实测环境是:服务器采用tomcat+servlet,手机是motorola e398,实测结果如下:
1、关于第一点,如果用HttpConnection的GET方式收只有一个字符‘a’的网页流量是1101,SocketConnection是929,我想这是HttpConnection底层实现添加了一些http头的原因。
2、关于第二点,wap网关会自动添加“connection: close”,如果是http服务器,也会相应返回这个标志并关闭链接(这点在rfc2616中也有说明)。所以说想持续连接是不太可能的,如果自己写一个服务器来解析HTTP,忽略这个标志会如何,这些我就没有试了。:)
mailbomb 发表于2006年4月25日 8:40:00  IP:举报
to alien75 :
首先感谢你的实际测试。
关于你提到的问题,解释如下:
1、关于这个流量问题,你可以控制客户端以及服务器端的头信息数量来达到控制流量的目的,而且CMWAP的收费可以包月,这个是CMNET无法比拟的。
2、通过这种方式实现的是半持续的连接,也就是只有手机和CMWAP直接是以socket进行连接,所以是持续的,而CMWAP和服务器之间使用的是HTTP连接,这个是每次需要重新建立的。但是HTTP编程最大的延迟来自于重新建立连接,所以使用该方式传输数据虽然无法利用过多的socket特性,但是可以在节约费用的同时,实现响应速度的提高。
最后补充一点,该种技术只是一种过渡技术,随着socket的普及以及费用的降低,这种技术会被淘汰。
alien75 发表于2006年4月24日 19:49:00  IP:举报
更正一点,我不是取的网页,而是在servlet中直接用输入输出流来做的。mailbomb 发表于2006年4月25日 11:22:00  IP:举报
to alien75 :
十分感谢您的积极评论,您的评论以及测试大大丰富了文章本身,再次对你表示感谢。alien75 发表于2006年4月25日 10:48:00  IP:举报
to mailbomb:
多谢你的用时回复
针对你的第二点说明,我做了一个简单测试。还是相同的测试环境和测试数据,做了两种测试。结果如下:

1、检测数据负载效率。每隔5秒发一个请求,20次后流量是11852。如果是HTTP方式,每一次事务请求从发起到完成都要大概1K吧。

2、检测手机多长时间不发数据WAP网关会断开链接。我是通过发送抛出异常来判断,发现这个值是25秒左右。测试时间是上午10点,而且我觉得这个值与各地的网关类型以及高峰时段应该有关连,所以只能做为一个参考值。因此象那种想利用现有连接发送的数据间隔不能太长,否则还是要重连的。

由此看来这种方式在目前是可行的,不知道3G出来后,CMCC会不会开放SOCKET? 在此再恶一把CMCC,就咱中国还分个什么CMNET和CMWAP,也算是中国特色吧。 ^_^zo 发表于2006年5月5日 16:22:00  IP:举报
不错,就是看不懂
orient 发表于2006年5月5日 20:25:00  IP:举报
//使用代理连接

SocketConnection sc = (SocketConnection)Connector.open("socket://10.0.0.172:80");

之后,如何连接到我的url服务器?
返回的消息是不是可以保证完整性?mailbomb 发表于2006年5月6日 8:21:00  IP:举报
to orient :
其实CMWAP是一个HTTP代理服务器,所以你的URL地址包含在发送过去的协议数据中,如代码:
String requestLine = "get http://www.freewebs.com/cqucyf/a.htm http/1.0\r\n";

这里是发送到的地址
orient 发表于2006年5月8日 21:20:00  IP:举报
非常感激你的回复。

因为我要模仿cmnet连接,那么协议数据中每次都有URL地址,同时我的消息(byte []形式)也放在里边么? 代理服务器(cmwap)如何转发我的消息(byte []形式)到我的指定服务器。

因为你的String requestLine = "get http://www.freewebs.com/cqucyf/a.htm http/1.0\r\n";
是get连接方式么。
如果方便,请你留下MSN。我的是jadyorient@hotmail.
commailbomb 发表于2006年5月9日 13:01:00  IP:举报
to orient :
你的具体byte类型的数据可以放在HTTP协议的实体数据部分,然后在服务器端解析就可以了.orient 发表于2006年5月11日 1:22:00  IP:举报
可以写一个post 连接的例子么。 呵

URL:
static final String HOST = "201.106.107.103";
static final int TCP_PORT = 9002;
我登陆平台时
发送消息 :
其中类型(short),账号(short),密码3项(string)。
服务器返回消息:
其中类型(short),ok (byte)。

手机6600。
mailbomb 发表于2006年5月11日 12:34:00  IP:举报
to orient :
只需要做如下更改即可:
String requestLine = "post http://201.106.107.103:9002 http/1.0\r\n";
你的协议部分可以写入实体数据部分即可

roseguns 发表于2006年5月21日 23:08:00  IP:举报
浪子,你好!
我按照您提供的例子进行实际的测试,的确没有问题。
不过,您的例子需要每个收发数据前都得和代理服务器建立一次联接。
可是如果这样做不就使用HTTP方式差不多了吗?
所以,我想也许改成只需建立一次连接就可以在这个连接上不断的收发数据的例子应该很简单,没想到,改来改去改了一个晚上,这样的例子也没有跑通。我看到你们在上面的讨论后,感觉自已就差那么一点却怎么样也达不到目标。
因此,如果楼主有时间的话,能不能也做一个可以只连接一次就可以不 断收发数据的例子呢?Aaron Chan 发表于2006年6月2日 14:58:00  IP:举报
顶起 希望有例子学习jerrytian 发表于2006年6月5日 11:12:00  IP:举报
技术上是可行的,但是实际的价值不是很大。效率上无法和真正的socket相比,HTTP本身的开销太大,而且要在终端的KVM上封装代价也过于高昂。

tbywx 发表于2006年7月31日 17:56:00  IP:举报
不知道你们是不是在真机上试验过。

我记得一个普通的MIDlet是untrusted,它是禁止socket连接80和8080端口的。所以上述程序在真机上只会抛出securityException,除非真是用证书认证过。cuilichen 发表于2006年8月9日 16:36:00  IP:举报
我试了一下,但是只有第一次可以连接上。紧接着的第二次连接就不行了,好像是阻塞了的样子。不知道第二次连接和第一次有什么必要的区别没有。
还有就是试着解析了一下输入流的内容,header和body之间使用空行来区分的。
cuilichen 发表于2006年8月9日 16:42:00  IP:举报
这个会不会有什么影响呢?

cuilichen 发表于2006年8月10日 11:05:00  IP:举报
赫赫,实现了多次通讯。
使用的是Nokia 6600。
目前的问题是,好像传输的过程中,部分内容丢失。
不知道为什么。
正在测试中。

fdsfds 发表于2006年8月14日 15:13:00  IP:举报
我记得一个普通的MIDlet是untrusted,它是禁止socket连接80和8080端口的。所以上述程序在真机上只会抛出securityException,除非真是用证书认证过。
我也碰到这个问题,真机上(3220)连接不了80端口,这个怎么能解决

truelwl 发表于2007年4月10日 22:34:05  IP:举报
还是每次请求一次socket连接,
从文章中和以上评论中没看出如何保持网络连接.
哪位大侠解释一下?

wap网关在把HTTP的response返回手机后会中断连接,
保持连接看起来很难实现.

fatterooo 发表于2007年8月2日 15:55:30  IP:举报
我用的索爱K750C测试
这句:
SocketConnection sc = (SocketConnection)Connector.open("socket://10.0.0.172:80");

抛出java.lang.SecurityException异常,这是怎么回事呢?Mailbomb 发表于2007年8月3日 10:27:32  IP:举报
这个是因为程序需要数字签名zjsjava 发表于2007年10月19日 10:48:51  IP:举报
只有手机和CMWAP直接是以socket进行连接!老师,你所谓的半持续连接就是手机这端在持续连接,而服务端跟CMWAP是非持续连接了。那我服务器端如果是SOCKET连接的,那以目前的情况来说,是否非的改成HTTP协议的规则去发送呢?这是否是目前针对手机端SOCKET的最优化连接方式呢?

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/mailbomb/archive/2006/04/24/674736.aspx

 

分享到:
评论

相关推荐

    J2ME----CSDN名士---陈跃峰老师讲课代码

    J2ME----CSDN名士---陈跃峰老师讲课代码 J2ME----CSDN名士---陈跃峰老师讲课代码

    java编程那些事儿-陈跃峰1-30

    java编程那些事儿-陈跃峰 不经意发现陈前辈的这本书,在网上没有找到归档的,于是,我自作多情地整理了一下,这样同志们在线下也能看这本书了。共分了三部分,这是第一部分,还有两部分,希望看这些文章的同志们一定...

    java编程那些事儿-陈跃峰71-102

    java编程那些事儿-陈跃峰 不经意发现陈前辈的这本书,在网上没有找到归档的,于是,我自作多情地整理了一下,这样同志们在线下也能看这本书了。共分了三部分,这是第三部分,还有两部分,定要注意

    java编程那些事儿-陈跃峰31-70

    java编程那些事儿-陈跃峰 不经意发现陈前辈的这本书,在网上没有找到归档的,于是,我自作多情地整理了一下,这样同志们在线下也能看这本书了。共分了三部分,这是第二部分,还有两部分,希望看这些文章的同志

    陈跃峰《Java编程那些事儿》

    陈跃峰《Java编程那些事儿》,来自他的个人博客,不错的Java教程

    java编程那些事

    java编程那些事-摘自陈跃峰的博客:http://blog.csdn.net/Mailbomb/

    J2ME射击游戏Demo

    J2ME射击游戏实现示例(含源代码和资源) 出自:http://blog.csdn.net/mailbomb<br>作者:陈跃峰 <br> 本示例是一个射击游戏Demo,主要功能包含: 1、 玩家飞机基本控制 2、 飞机连续发射多颗子弹 3、 ...

    Java编程那些事儿

    陈跃峰 Java编程那些事儿 完整版110章节连载 chm 花了一晚上下载制作成chm格式

    Java编程那些事儿[完整版]PDF(无加密版)

    有CSDN的MVB 陈跃峰老师摘写,适合JAVA初学者的一本书! 由本人收集整理成完成版转换成PDF格式上传CSDN! 作者:陈跃峰老师 收集整理:云低夕落人归

    java那些事儿chm版本

    Java编程那些事儿系列文章(全集) 整理好的chm 作者:陈跃峰 来源:http://blog.csdn.net/mailbomb

    Java编程那些事儿[完整版]PDF(加密版)

    有CSDN的MVB 陈跃峰老师摘写,适合JAVA初学者的一本书! 由本人收集整理成完成版转换成PDF格式上传CSDN! 作者:陈跃峰老师 收集整理:云低夕落人归

    Java编程那些事儿系列文章.pdf(全)

    东西不错,和大家共享!原作者为陈跃峰,这里仅供学习交流用。

    Java编程那些事儿.pdf

    java类书箱,作者:陈跃峰,编写一本书,总要有个名字吧,姑且把书名叫做《Java 编程那些事儿》 吧,主要是用通俗的语言,解释清楚以下几个内容: 1、 程序设计是什么? 2、 Java 语言相关基础语法及应用 3、 如何...

Global site tag (gtag.js) - Google Analytics