开发适应中国网络的J2ME连网程序

来源:互联网 发布:手机跟踪定位器软件 编辑:程序博客网 时间:2024/06/07 14:48

 

3 .1 中国的网络环境

 

运营商

代理名称

用法介绍

直连名称

用法

中国移动

CMWAP

CMWAP是中国移动的GPRS代理上网

创建连接的时候,不能直接采用

Connector.open("target address");

而是采用代理的方式进行连接

具体相关的创建代码是代理的方式。

代理地址是:10.0.0.172

代理Header是:X-Online-Host

CMNET

3家运营上的直连方式,创建连接跟PC无异。

中国联通

UNIWAP

UNIWAP是中国联通退出的一种上网模式。类似于中国移动。具体创建连接的方式跟中国移动类似。

代理地址是:10.0.0.172

代理Header是:X-Online-Host

在处理网关的时候可能会有一些细致的差别,比如在发送Header数据的时候。

UNINET

中国电信

CTWAP

CTWAP 是中国电信最近推出的上网方式。到目前为止我还没有找到j2me可以上ctwap的方式,网上只是提到了代理地址是10.0.0.200,header key是啥,该传什么值,暂时还不知道,如果有读者知道的可以联系我(gooogledev@gmail.com)

CTNET

3 .2 HttpConnection 介绍

  我们先来讲解下HttpConnection相关的方法。

  现在您已经看到 GCF 是如何支持不同类型的连接的,并且开发了我们的第一个连网 MIDlet,现在可以更深入地分析 MIDP 中对 HTTP 的支持。我们将首先从一个更新过的层次结构图开始,它表明了哪个类提供了对 HTTP 连接的支持。

图:支持 HTTP 的 GCF 类


  原来的 MIDP 1.0 规范只要求设备支持 HTTP 连接协议,而更新的 MIDP 2.0 规范要求同时支持 HTTP 和 HTTPS,后者提供了对更安全 style="COLOR: #000000" href="http://safe.it168.com/" target=_blank>安全的网络连接的支持。使用这些协议的 API 分别是 HttpConnection 和 HttpConnection 。除了这些强制性的协议,设备制造商可能会选择支持更多的通信协议,如数据包或者套接字。虽然有时会方便一些,但是您应当了解使用特定于厂商的协议会影响应用程序到其他设备的可移植性。

  请求和响应协议:HTTP 和 HTTPS 都是请求/响应协议。客户机发送请求,而服务器 style="COLOR: #000000" href="http://server.it168.com/" target=_blank>服务器发送响应。在继续后面的内容之前,我们将分析客户请求和服务器响应的各个方面。

  客户请求:客户请求(client request),有时称为请求实体,由以下三个部分组成:

· 请求方法

· 头

· 正文

  我们将详细讨论这三个部分。

  请求方法:请求方法(request method)确定数据如何发送给远程资源。可以使用的三种方法是 GET、 POST 和 HEADER 。使用 GET 时,数据是作为 URL 的一部分发送的。使用 POST 时,所有客户机数据都是在与建立连接的请求不同的、单独的流中发送的。 HEADER 请求不向服务器发送任何数据。相反, HEADER 请求只是描述(meta)关于远程资源的信息。

用 GET 打开一个 HTTP 连接

String url = "http://www.ucweb.com?size=large";

HttpConnection http = null;

http = (HttpConnection) Connector.open(url);

http.setRequestMethod(HttpConnection.GET);

setRequestProperty("User-Agent", "Openwave");

Openwave -- 是一个比较出名的Wap浏览器厂商,因此设置这个UA,移动网关一般可以通过。

用 POST 打开一个 HTTP 连接

String url = "http://www.ucweb.com",

tmp = "test data here";

OutputStream ostrm = null;

HttpConnection http = null;

http = (HttpConnection) Connector.open(url);

http.setRequestMethod(HttpConnection.POST);

// Send client body

ostrm = http.openOutputStream();

byte bytes[] = tmp.getBytes();

for(int i = 0; i < bytes.length; i++)

{

 os.write(bytes[i]);

}

os.flush();

  POST/GET 请求一般都是在网页中的Form进行指定,如果你乱用这些请求可能会导致一些意外的效果,比如Form指定POST请求,则用GET请求就会出问题。

  上面的请求过程只是完成一次HTTP请求中的客户端请求,下面我们来看下服务器是怎么响应的。

  服务器响应:当服务器收到并处理了客户请求后,它必须打包并发送响应。与客户请求一样,服务器响应有三个部分:

· 状态行

· 头

· 正文

  状态行:顾名思义, 服务器状态行(server status line)通知客户机其请求的结果。HTTP 将状态行代码分为以下三大类:

· 1xx是提供信息 。

· 2xx是成功 。

· 3xx是重定向 。

· 4xx是客户机错误 。

· 5xx是服务器错误。

  更加具体的响应代码请查看HTTP相关协议文档。

  介绍一本书《Java Servlets 2.3 编程指南》此书状态代码有详细的介绍。

  服务器状态行包括在服务器上运行的协议版本号、状态码和表示返回代码的文字消息。下面是有效的状态行的几个例子:

· “HTTP/1.1 200 OK”

· “HTTP/1.1 400 Bad Request”

· “HTTP/1.1 500 Internal Server Error”

  头:与客户机不同,服务器可以通过头字段发送信息。

  显示了三种最常用的、提取来自服务器的头信息的方法。

String  getHeaderField(int n) Get header field value looking up by index

String  getHeaderField(String name) Get header field value looking up by name

String  getHeaderFieldKey(int n) Get header field key using index

  注意:虽然系统给你提供了这些方法,但建议你通信的时候别这么做,因为有可能有些地方的移动网关会过滤掉你这些参数。至于该怎么传输你想要的数据,那就看各位的私有的协议是咋通讯了。

  在开发网络软件,很多时候是需要调试的,因此一款好的抓包工具对我们的工作帮助是很大的,在这里我推荐使用iris http://www.eeye.com/html/Products/Iris/index.html


HttpConnection API

 

方法

说明

long getDate()

得到头字段日期

long getExpiration()

得到头字段失效时间

String getFile()>

从 URL 得到文件名

int getHeaderField(int n)

通过查询索引得到头字段值

String getHeaderField(String name)

通过查询名字得到头字段值

long getHeaderFieldDate(String name, long def)

得到作为 long 型的指定字段(表示日期)

int getHeaderFieldInt(String name, int def)

得到作为整数的指定字段

String getHeaderFieldKey(int n)

使用索引得到头字段键

String getHost()

根据 URL 得到主机

long getLastModified()

得到最后修改的字段值

String getPort()

从 URL 得到端口

String getProtocol()

从 URL 得到 协议

String getQuery()

得到查询字符串(只对 GET 请求有效)

String getRef()

得到 URL 的引用部分

String getRequestMethod()

得到请求方法的当前设置( GET 、 POST 或者 HEAD )

String getRequestProperty(String key)

得到一种请求属性的当前设置

int getResponseCode()

得到响应码(数字值)

String getResponseMessage()

得到响应消息(文字值)

String getURL()

得到整个 URL

void setRequestMethod(String method)

设置请求方法( GET 、 POST 或者 HEAD )

void setRequestProperty(String key, String value)

设置请求属性(头信息)


注意点:我们在使用Http的过程中最常用的方法就是getResponseCode(); openInputStream()等操作。

HttpConnection的实现原理,并不是在open的时候去连网,而是你做getResponseCode();

openInputStream(); openOutputStream(); 等读写操作的时候才真正的去创建。因此只是调用open()是不会触发连网动作的。

HttpConnnection在底层的实现上也是采用TCP Socket的方式进行数据的读写。


3 .3 创建GPRS连接

  在中国目前知道的可以连接成功的有中国移动,跟中国联通,由于移动起步比较早,相对网关,以及基站方面的建设要好于联通,而且基于移动方面的软件也相对多而且成熟,因此联通在建设GPRS方面就向移动靠拢,原则上来说,联通是无缝兼容移动的,但是也不保证有细微的差别,读者在开发网络环境下的软件的时候,最后经过两个网络的验证才能保证产品的网络质量。至于电信,由于电信刚接手移动通信,因此在网络的建设,经验方面相对差点,因此到目前为止,我还没有找到一个办法连接ctwap。这里只介绍cmwap,uniwap连接的创建方式以及注意事项。


  打开GPRS Http连接的代码清单

  HttpConnection sHttp = (HttpConnection) .Connector.open("http://10.0.0.172:80");

  sHttp.setRequestProperty("X-Online-Host","wap.ucweb.com");

  代码就这么简单,不过这里需要注意的Header的发送。


  User-Agent -- 非常重要的参数,很多网站对这个字段很敏感,如果这个字段发送有误,或者含糊不清,及有可能对方服务器会相应500,或者其他错误。

  Connection -- 向对方服务器请求连接的模式,Close 请求一次就关闭,Keep-Alive 保持连接,原则上说来,keep-alive可以达到最优化的速度,但是也是需要客户端跟服务器同时支持才行。建议采用close模式,这样做就比较稳妥了。


  还有其他一些参数,可以参考HTTP相关的协议说明。

 

原创粉丝点击