您的位置:首页 > 大数据 > 人工智能

http://hi.baidu.com/ch ... 35827.html%23

2010-03-16 21:22 363 查看
本文来自:http://supervipman.spaces.live.com/blog/cns!956332DB1D665894!284.entry

首先要说的是大家最关切的cmwap和cmnet的区别。因为这个直接涉及玩家付费,而付费的问题又直接涉及到我们开发的程序是否有很多玩家支持。
要清楚的知道所谓的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协议(应该是“HTTP代理协议”,by oChapman),需要添加主机头域"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¶m2=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 ()这两个方法。就这么简单,呵呵,别的不多说了,打得手累!

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐