`
buerkai
  • 浏览: 170353 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论
阅读更多
J2me上的GPRS网络接入点有两个,一个就是CMNET,一个就是CMWAP。一般移动梦网,百宝箱就是挂在CMWAP上的。

CMNET

CMNET就是一般的互联网的网络接入点。我们一般在SUN那里看到的J2ME实例代码都是基于CMNET接入点的网络下载。一般来说,CMNET可以连接所有的网络站点。下面就是我在开发仙剑的CMNET的下载资源包的代码片断。

   /***************************************************************************

   * 下载网络文件

   * @param url String 要下载的文件的地址URL

   * @return byte[] 如果下载成功,返回文件的字节缓冲;

   *             如果下载失败,返回null

   */

  public byte[] download_CMNET(String url) {

    ContentConnection c;

    InputStream is = null;

    byte[] data = null;

    try {

       c= (ContentConnection)Connector.open("http://"+ServerName+"/"+url,Connector.READ,true);

       is = c.openInputStream();

       int dataLength = (int) c.getLength();

       if (dataLength == -1) {

         ByteArrayOutputStream bStrm = new ByteArrayOutputStream();

         int ch;

         while ( (ch = is.read()) != -1)

           bStrm.write(ch);

         data = bStrm.toByteArray();

         bStrm.close();

       }

       else {

         data = new byte[dataLength];

         Data_Read_Buf(is,data,0,dataLength);

       }

       is.close();

       c.close();

    }catch (Exception e) {

      data = null;

    }

    c= null;

    return data;

  }

代码很普通,不过需要注意的有以下两点。

1.       getLength()并不是一定都有效,比如我发现在Nokia 40的手机上这个函数有效,但是在Nokia 60的手机上,这个函数通常都无效。所以我们通常都必须要有另外一个下载方式,既是从while循环不断从输入流中一个一个读byte,如果读出为-1,则表示输入流数据读完。

2.       Connector.open最后一个参数是表示是否允许timeout,通常我们都得设置true,因为GPRS网路经常中断,那么必须有个timeout来退出连接。依照我的经验,一般如果能够执行完c.openInputStream()后,就表明连接上了,只要连接上后,数据的下载是比较快的(也就是说网络连接是最慢的)。

CMWAP

      MOTO的手机通常都是默认接入点就是CMWAP。在手机上的“网页“->”网页设定”中可以设置默认的接入点。一般中国大陆的出产的MOTO手机都是设置的”移动梦网”的网络接入点,起始就是CMWAP接入点。而MOTO最可恶的一点就是一旦默认接入点是CMWAP,那么所有的J2ME应用程序都无法访问CMNET。而Nokia 40虽然默认的接入点是CMWAP,但是运行中可以自动检查CMNET来访问CMNET。

      解决MOTO的网络连接有两个办法:

1.       在”网页“->”网页设定”中新建一个网页,然后不需要填写任何参数,设置成默认后,它就可以让手机上J2ME程序通过CMNET访问网络了。

2.       通过移动的代理来实现通过CMWAP访问互联网。下面是仙剑中使用CMWAP下载资源包的代码片断:

/***************************************************************************

* 下载网络文件

* @param url String 要下载的文件的地址URL

* @return byte[] 如果下载成功,返回文件的字节缓冲;

*             如果下载失败,返回null

*/

public byte[] download_CMWAP(String url) {

  HttpConnection c;

  InputStream is = null;



  byte[] data = null;

  try {

     c= (HttpConnection)Connector.open("http://10.0.0.172:80/"+url,Connector.READ,true);

     c.setRequestProperty("X-Online-Host",ServerName);

     c.setRequestProperty("Accept", "*/*");

     is = c.openInputStream();

     int dataLength = (int) c.getLength();

     if (dataLength == -1) {

       ByteArrayOutputStream bStrm = new ByteArrayOutputStream();

       int ch;

       while ( (ch = is.read()) != -1)

         bStrm.write(ch);

       data = bStrm.toByteArray();

       bStrm.close();

     }

     else {

       data = new byte[dataLength];

       Data_Read_Buf(is,data,0,dataLength);

     }

     is.close();

     c.close();

  }catch (Exception e) {

    data = null;

  }

  c= null;

  return data;

}

比如我们要下载

http://xxx.xxx.xxx.xxx/BB/AA.dat,那么上面的ServerName= ”xxx.xxx.xxx.xxx”, 而url = ”BB/AA.dat”
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



   要清楚的知道所谓的cmwap和cmnet只是中国移动(CMCC)为了它的计费方便,给用户提供的两个手机上网接入点。cmwap是按包月计费的,前提是该用户已经加入某一个包月服务(废话>>*&^%^%)。cmnet是按照流量来计算的,也有谣传说cmnet中国移动无法计费的,不管怎么说,这种接入方式,玩家的荷包要大出血的,我的好多机友都有惨痛经历,在此深表同情。
现在清楚了cmwap和cmnet的区别之后,我给大家再说说对于开发人员来说,具体实现的做法。
      一般我们现在程序开发的时候有3种方式:
      ①HTTP协议,直接联网。
      如果url是“www.mySpace.com/test”,那么程序如下:
      httpConnection = (HttpConnection)Connector.open(“http://www.mySpace.com/test”);
      ②HTTP协议,需要添加主机头域"X-Online-Host"和分隔符头域“Accept”。
      如果url是“www.mySpace.com/test”,那么程序如下:
      httpConnection = (HttpConnection)Connector.open(“http://10.0.0.172:80/test”);
      httpConnection.setRequestProperty("X-Online-Host", “www.mySpace.com”);
      httpConnection.setRequestProperty("Accept", "*/*");
      ③SOCKET协议。
      如果url是“www.mySpace.com/test”,那么程序如下:
      socketConnection = (SocketConnection)Connector.open(“socket://www.mySpace.com/test”);
      OK,这就是我们最普遍的程序联网的方式。那么和cmwap与cmnet有什么区别呢?现在我就说明。
      cmwap只可以走HTTP协议,也就是第三种方式不可行。cmnet既可以走HTTP协议,又可以走SOCKET协议,只是无论如何都需要直接连接url,即第二种不可行。于是现在问题出来了,按照我们程序员的认识open(url)就足以,为什么会闹出来一个添加头域信息的呢?而且同属于在cmwap下面的联网方式的?这里我是这么理解的,部分手机终端厂商为了迎合中国移动的要求,部分手机里面内置了一个程序,一旦检测到接入点是cmwap的,它就会把当前请求的url分解,怎么分解的呢?就是第二种方式的分解,把主机和主机后面的url分别写入不同的位置了,在头域里面标记了主机的内容和一个分隔符的标志。说到这里,部分读者就会明白了,如果说部分手机有这么一套机制可以分解url,那么那些没有这个机制的,就只有程序员自己实现了,于是出现了第二种方式。是的,至少我想是这个原因。
      所以,这就解释了两个问题:
      1、为什么有些手机,比如NOKIA7210,用第二种方式不能够联网?因为手机自己会解析请求的url,如果按照第二种方式写的话,那么url又被解析一次,就成了
      httpConnection = (HttpConnection)Connector.open(“10.0.0.172:80/test”);
      httpConnection.setRequestProperty("X-Online-Host", “10.0.0.172:80”);
      httpConnection.setRequestProperty("Accept", "*/*");
      成了请求移动网关了,它怎么会有你的test呢?不可能成功的,除非是赶巧了。那就要恭喜你中奖了,可以给移动来点XXXX的了。
      2、选择cmwap联网的手机实际上最终请求的是“10.0.0.172:80”这个url,即移动的网关。这就知道了移动如何计费的了。走它的网关,它想怎么计费还不行啊。
      现在需要重点说明的是,HTTP协议的直接请求url的方式,不是cmwap专有的,上面说了cmnet也可以。
      那么怎么区分是cmwap还是cmnet呢?
      我的观点是:程序员不可能实现的。因为这个是手机自己的特性。它要么是在出厂的时候就被限制死了,要么就是像部分智能手机那样可以让用户自己选择。所以,程序员无法控制这些。除非你事先知道了这个手机的这个特性,否则你要是硬来的话,就像7210上面采用第二种方式联网,那么你就别想连接成功了。
      现在说说GPRS,这个大家已经很熟悉的词汇。在此还是要感谢一下阿里山和xinian_yang,因为是阿兄给我讲明白的这些,而xinian_yang兄则是这个话题的发起者,嘿嘿,我是组织者。要说有啥好讲的,GPRS不就是上网吗?原来网不是这么好上的,GPRS是分级别的!我们都知道手机有自己的语音通道,那么上网走的是手机的什么通道?通过阿兄的讲解,我知道了,GPRS的10级才可以上网和语音双通道同时开通,比这个级别低的,都只有一个通道单独存在,即要么上网要么通话,当低级别的GPRS在上网的时候,如果有电话打入的话,你会听到的是占线的提示音,叮咚!这下子大家知道,为商在上网的时候会接不到电话或者短消息了吧?哈哈。
      似乎没有什么要说的,有!就是关于数据传输方面的。
      网上的,或者说sun提供的,大部分是这样的:
      connection = (XXXXXXXX)Connector.open(“10.0.0.172:80/test”);
      os = connection.openOutputStream();
      is = connection.openInputStream();
      os.writeByte(...);
      in ch = 0;
      while(ch != 1){
       ch = is.read();
      }
      好的,就是这样,当然,里面的部分实例会依据不同的协议有所区别。那么,我的问题是,谁会用这个糟糕的东西去实现自己的应用的???当然,这个只是例子,目的是告诉大家该怎么用这些API,呵呵,所以,大家千万别以为sun出的就一定是真理!不是的!
      通过我的研究,我发现在数据传输方面有六种方式(没有算上sun提供的那种方式):
      ①HTTP的协议,参数写在头域中。
      ②HTTP的GET方式。
      ③HTTP的POST方式,但是在BODY中自己实现了名值对的组合,即param1=XX&param2=XX的参数传输形式,采用的API是DataOutputStream的writeUTF()。
      ④HTTP的POST方式,但是在BODY中是按照和服务器端事先约定好的数据传输格式传输的,采用的API是DataOutputStream的write()、writeByte()、writeUTF()、writeInt()、writeShort()等等方法。
      ⑤SOCKET的方式,这个时候就需要为网络部分建立两个线程,一个用来发送数据,采用名值对,我这里不多说了,另一个是接收数据,用的是DataInputStream的read()、readByte()、readUTF()、readInt()、readShort()等等方法。
      ⑥SOCKET的方式,这个时候仍然需要为网络部分建立两个线程,一个用来发送数据,用的是第三种方式提到的那些API,另一个是接收数据,用的是DataInputStream的read()、readByte()、readUTF()、readInt()、readShort()等等方法。
      HTTP的协议的接受方式有两种:
      ①读取服务器反馈信息的头域,用的是HttpConnection的getHeaderField()方法。
      ②读取服务器反馈信息的BODY,用的是DataInputStream的read()、readByte()、readUTF()、readInt()、readShort()等等方法。
      我个人主张的在程序里面实现第四种和第六种方式接收数据采用读取BODY的内容。因为这两个在结构上是相似的,容易架构在一起,而且解析的过程也比较简单,不用找分隔符,而且可以传输大容量的数据。只是,它也有缺点,就是采用这种方式的话,需要服务器端的开发人员和客户端的开发人员,事先定义好他们之间的数据传输的格式。
      以登陆为例,就是要定义是先传登陆名还是先传密码,登陆名是什么数据类型,是byte还是int还是String的,密码是什么类型,是byte还是int还是String的。
      就是这堆东西。由于不同的应用这些东西可能不一样,所以需要为每一个都量身定做。似乎这样很麻烦的。呵呵,其实不是的,至少我认为不是,因为我们可以把那些通用的都整理出来,这样也就便于维护了,比如登陆、注册、更新数据等等,这些几乎每一个应用都有,也几乎每一个都是一个样子的,那么在第一次定义好之后,以后就不用再定义了,那不是省事了,哈哈。
      这里忘记了一个最重要的东西,那就是,一定要告诉服务器你打算做什么!就是你要登陆还是注册,这个一般都是用数字表示的。按照我的想法,也应该是写在BODY里面的,我一般都是使用int类型的,表示事件的ID。
      最后,再说说网络框架的搭建。我的建议是为网络开两个线程(这样加上应用主线程,总共就是三个线程,别害怕啊,呵呵)。一个是发送数据的线程,一个是接收数据的线程。大家一看,诶?和上面的SOCKET的方式一样。呵呵,是的,这就是为了把HTTP协议的和SOCKET协议的整合在一起做出的妥协。具体的原因,我就不多说了,大家亲自做的时候,可以体会到的。我要说的就是一个实现的大体思路。其实很简单的,就是在线程中灵活使用wait()和notify()这两个方法。就这么简单,呵呵,别的不多说了,打得手累!


分享到:
评论

相关推荐

    CMWAP和CMNET 的主要区别与适用范围

    CMWAP 和 CMNET 的主要区别与适用范围 作为中国特色的手机上网两种方式,CMWAP 和 CMNET 是中国移动人为划分的两个 GPRS 接入方式。CMWAP 是为手机 WAP 上网而设立的,主要是为了手机用户上网,而 CMNET 则主要是为...

    j2me自动连接网络,可以是cmwap或者cmnet

    - 一个示例程序,演示如何自动选择CMWAP或CMNET进行网络连接。 - 相关的类文件,如`NetworkManager`或`ConnectionHandler`,用于管理网络连接。 - 可能还包括配置文件,用于存储接入点设置或用户偏好。 - 测试用例,...

    移动G3客户端(CMNET CMWAP皆可)

    描述中的“中兴 华为都可以用”表明该客户端软件已经过测试,能够顺利在中兴和华为的手机上运行,实现3G网络的连接和数据通信。移动G3连接客户端可能是运营商提供的专有软件,旨在简化用户连接到3G网络的过程,确保...

    j2me常见问题(push,cmnet,cmwap,rms,字符转码...)

    本文将深入探讨J2ME中的一些常见问题,包括Push技术、网络连接(CMNET与CMWAP)、Record Management System(RMS)以及字符转码等核心概念。 首先,让我们讨论Push技术。在J2ME中,Push是指服务器主动向客户端发送...

    GPRS数据传输的控制(CMWAP和CMNET)[参考].pdf

    总结来说,GPRS数据传输的控制涉及到多个AT命令和网络配置,其中CMNET和CMWAP的使用差异主要在于是否需要通过网关访问互联网。理解并掌握这两种接入点的区别和使用方法,对于开发适应各种网络环境的移动应用程序具有...

    关于cmwap网络切换

    本教程将详细探讨如何在Android系统中进行CMWAP网络的切换和配置。 一、CMWAP网络简介 CMWAP是GPRS(General Packet Radio Service)网络下的一种接入点名称(Access Point Name,简称APN),它是中国移动为用户...

    AndroidWIFI,CMWAP,CMNET的自动判断访问.pdf

    标题提到的"AndroidWIFI,CMWAP,CMNET的自动判断访问"是指在Android设备上如何根据不同的网络连接方式(如Wi-Fi、CMWAP和CMNET)来适配网络请求。在描述中提到了在开发过程中遇到的问题,即HTTP服务在某些网络环境下...

    WAP、WIFI、CMWAP、CMNET上网方式的区别与联系.docx

    WAP、WIFI、CMWAP和CMNET是四种常见的互联网接入方式,它们各有特点,适用于不同的场景和设备。 首先,WAP(Wireless Application Protocol)是一种无线应用协议,主要用于简化网页内容,使其适合在早期功能手机上...

    WAP、WIFI、CMWAP、CMNET上网方式的区别与联系.pdf

    综上所述,WAP、WIFI、CMWAP和CMNET代表了不同的网络接入方式和协议,各有其特点和适用场景。了解这些差异有助于用户根据自身需求选择合适的上网方式,并合理控制费用。在使用过程中,还应注意网络设置和安全问题,...

    设置windowsPPC上网归类.pdf

    Windows PPC(Pocket PC)设备的网络设置主要涉及到GPRS、CMNET和CMWAP的区别与配置。GPRS(General Packet Radio Service)是一种2.5G网络技术,提供无线数据服务,理论最高速度可达115Kbps。中国移动将GPRS服务...

    IPHONE3 解决CMWAP上网方法

    由于iPhone的特性,它并不直接支持CMWAP接入,但通过特定设置和技巧,我们仍可以使iPhone 3系列设备顺利接入并使用CMWAP网络。 首先,我们需要理解CMWAP和CMNET的区别。CMNET是全面的互联网接入服务,而CMWAP则主要...

    CMWAP配置描述文件

    - 确保来源可信:因为配置文件涉及到网络连接和可能的敏感信息,用户应仅从可信赖的源下载和导入。 - 检查权限:导入配置文件可能会改变设备的网络设置,因此在操作前应了解其可能的影响。 - 可逆操作:如果导入后...

    g3 随意行改CMWAP

    【标题】"g3 随意行改CMWAP"涉及到的是移动网络连接设置的修改,特别是将G3(第三代移动通信技术,即3G)的随意行套餐转化为使用CMWAP(China Mobile WAP,中国移动的非对称数据传输服务)连接的方式。在移动通信...

    GPRS拨号访问网络

    ClientSocket.cpp可能包含了处理网络连接和数据传输的部分;.dsp和.dsw文件则是Visual Studio项目文件,用于管理编译和构建过程。 总的来说,这个程序展示了如何利用SIM300模块通过GPRS拨号实现计算机与IP服务器的...

    Http.rar_C http_http请求_j2me socket cmnet_s40 cmnet socket_visual

    J2ME中的Socket编程是实现网络连接的基础。Socket是TCP/IP协议的一部分,提供了一种在两台计算机之间建立和维护连接的方式。在J2ME中,可以使用`java.net.Socket`类创建一个套接字,与服务器建立连接,并通过输入...

    NOKIA手机连接电脑上网设置教程

    通过深入解析NOKIA手机连接电脑上网的设置教程,特别是对CMWAP和CMNET两种接入方式的对比分析,我们不仅理解了这两种接入方式的技术原理和应用场景,还掌握了在不同情况下做出合理选择的能力。无论是追求速度的高速...

    CDS 3.0软件的GPRS CQT和DT测试方法.doc

    - **电脑拨号设置**:电脑需要设置调制解调器,创建并配置CMNET和CMWAP拨号连接,以便进行GPRS连接。 在进行CQT和DT测试时,必须严格按照《2005年第三方GPRS业务测试规范》进行,确保测试的准确性和公正性。测试...

    手机连接电脑上网详解.doc

    - 为了安全起见,建议定期更新手机和电脑的防病毒软件,防止通过网络连接传播的恶意软件。 总结起来,手机连接电脑上网是一种利用手机的网络功能扩展电脑上网能力的方法,通过 CMWAP 和 CMNET 两种方式实现。尽管 ...

    BlackBerry 网络连接编程

    ### BlackBerry网络连接编程 ...综上所述,BlackBerry JDE API提供了多种不同的网络连接方式,每种方式都有其特定的应用场景和优缺点。开发者在进行网络编程时需要根据具体需求和环境选择最合适的方式。

Global site tag (gtag.js) - Google Analytics