在这次三叶草竞赛中,因为应用范围的放宽,我们发现有些队伍将手机端与服务器端通过Http连接在了一起,从而极大地扩展了手机端的应用。那么如何在手机端开发基于Http的通信模块呢?又需要注意哪些细节呢?

一、建立连接

J2ME使用Connector通过动态类型转换获得一个HttpConnection对象,由HttpConnection进行所有的基于Http的操作。这与桌面环境有所不同。

 

1HttpConnection conn = (HttpConnection) Connector.open(url, permission);

 

需要注意的是,通过实践我们发现使用CMWAP进行连接时不能直接通过目标URL访问到基于WEB的内容,必须通过中国移动的代理才可以。具体实现方式如下:

 

 1String proxy = http://10.0.0.172/;
 2String url = "index.jsp";
 3String domain = "http://polarbear.cn/"
 4if (isCmwap) {
 5 conn = (HttpConnection) Connector.open(proxy + url, permission);
 6 conn.setRequestProperty("X-Online-Host", domain);
 7// 否则直接连
 8}
 else {
 9 conn = (HttpConnection) Connector.open(domain + url, permission);
10}

11

 

另外,使用CMWAP连接会收到中国移动的资费提醒页面,需要再次请求连接才能顺利连接服务器。这点在模拟器上无法调试出来,必须在真机上测试。

二、传输数据

Http的传输方式分为GET和POST两种,GET主要用于简单的内容请求,可以附带一些参数,而POST则适合发送大量数据。两者在传输数据方式上有很大区别。

GET方式:

需要手动将网址、参数等进行构造,使用StringBuffer类拼接字符串,以形成一个网址,然后通过之前的getConnection()方法获得连接。

POST方式:

首先通过getConnection()方法获得连接,然后在这个连接中打开数据流进行字节流传输。

 

 1byte[] sending = something;
 2// 设置post内容的长度
 3conn.setRequestProperty("Content-Length", String.valueOf(sending.length));
 4// 打开数据输出流
 5os = conn.openOutputStream();
 6// 输出
 7os.write(sending);
 8// flush缓冲区,将缓冲区里的东西都输出出去
 9os.flush();
10//简单关闭,实际应考虑更多
11os.close();

 

三、设置Cookie

中国移动可能会过滤从服务器返回的Cookie信息,因此需要在服务器和手机两端分别设置自己的Http头信息,以避免默认的Cookie字段被过滤的情况发生。

四、获取服务器返回信息
有一点需要注意,对conn的get方法必须在所有set方法之后。否则抛出IOStreamException。可以通过conn.getResponseCode()获得服务器的返回Code。如果返回Code为200说明传输正常。

五、编码

在传输中一定会遇到编码乱码的问题,其中GET方式与POST方式的编码过程是不同的,这点尤其需要注意。

POST方式只需要统一手机和服务器的解析编码,将输出流编码为UTF-8格式即可。而GET方式则没有这么简单。简单的通过地址栏传递中文参数必然会导致乱码。在J2SE中我们有URLEncoder进行编码,可以将这个类简单移植到J2ME中,将需要访问的网址通过URLEncoder编码后,服务器端会自动解析,避免乱码问题发生。

六、读取返回数据

服务器返回的信息可以通过打开输入流进行简单的读取。记得在使用完后安全的关闭流。

以上就是对手机端连接服务器的整个过程进行简单的描述,很多具体的问题只有通过实践才能得到答案,希望以上的介绍能够给读者的开发带来帮助。

posted on 2009-06-17 20:49  Latifrons  阅读(357)  评论(0编辑  收藏  举报