(1) 由于无线设备所能支持的网络协议非常有限,仅限于HTTP,Socket,UDP等几种协议,不同的厂家可能还支持其他网络协议,但是,MIDP 1.0规范规定,HTTP协议是必须实现的协议,而其他协议的实现都是可选的。因此,为了能在不同类型的手机上移植,我们尽量采用HTTP作为网络连接的首选协议,这样还能重用服务器端的代码。但是,由于HTTP是一个基于文本的效率较低的协议,因此,必须仔细考虑手机和服务器端的通信内容,尽可能地提高效率。
对于MIDP应用程序,应当尽量做到:
1.发送请求时,附加一个User-Agent头,传入MIDP和自身版本号,以便服务器能识别此请求来自MIDP应用程序,并且根据版本号发送相应的相应。
2.连接服务器时,显示一个下载进度条使用户能看到下载进度,并能随时中断连接。
3.由于无线网络连接速度还很慢,因此有必要将某些数据缓存起来,可以存储在内存中,也可以放到RMS中。
对于服务器端而言,其输出响应应当尽量做到:
1. 明确设置Content-Length字段,以便MIDP应用程序能读取HTTP头并判断自身是否有能力处理此长度的数据,如果不能,可以直接关闭连接而不必继续读取HTTP正文。
2. 服务器不应当发送HTML内容,因为MIDP应用程序很难解析HTML,XML虽然能够解析,但是耗费CPU和内存资源,因此,应当发送紧凑的二进制内容,用DataOutputStream直接写入并设置Content-Type为application/octet-stream。
3. 尽量不要重定向URL,这样会导致MIDP应用程序再次连接服务器,增加了用户的等待时间和网络流量。
4. 如果发生异常,例如请求的资源未找到,或者身份验证失败,通常,服务器会向浏览器发送一个显示出错的页面,可能还包括一个用户登录的Form,但是,向MIDP发送错误页面毫无意义,应当直接发送一个404或401错误,这样MIDP应用程序就可以直接读取HTTP头的响应码获取错误信息而不必继续读取相应内容。
5. 由于服务器的计算能力远远超过手机客户端,因此,针对不同客户端版本发送不同响应的任务应该在服务器端完成。例如,根据客户端传送的User-Agent头确定客户端版本。这样,低版本的客户端不必升级也能继续使用。
MIDP的联网框架定义了多种协议的网络连接,但是每个厂商都必须实现HTTP连接,在MIDP 2.0中还增加了必须实现的HTTPS连接。因此,要保证MIDP应用程序能在不同厂商的手机平台上移植,最好只使用HTTP连接。虽然HTTP是一个基于文本的效率较低的协议,但是由于使用特别广泛,大多数服务器应用的前端都是基于HTTP的Web页面,因此能最大限度地复用服务器端的代码。只要控制好缓存,仍然有不错的速度。
SUN的MIDP库提供了javax.microediton.io包,能非常容易地实现HTTP连接。但是要注意,由于网络有很大的延时,必须把联网操作放入一个单独的线程中,以避免主线程阻塞导致用户界面停止响应。事实上,MIDP运行环境根本就不允许在主线程中操作网络连接。因此,我们必须实现一个灵活的HTTP联网模块,能让用户非常直观地看到当前上传和下载的进度,并且能够随时取消连接。
一个完整的HTTP连接为:用户通过某个命令发起连接请求,然后系统给出一个等待屏幕提示正在连接,当连接正常结束后,前进到下一个屏幕并处理下载的数据。如果连接过程出现异常,将给用户提示并返回到前一个屏幕。用户在等待过程中能够随时取消并返回前一个屏幕。
我们设计一个HttpThread线程类负责在后台连接服务器,HttpListener接口实现Observer(观察者)模式,以便HttpThread能提示观察者下载开始、下载结束、更新进度条等。HttpListener接口如下:
实现HttpListener接口的是继承自Form的一个HttpWaitUI屏幕,它显示一个进度条和一些提示信息,并允许用户随时中断连接:
HttpThread是负责处理Http连接的线程类,它接受一个URL和HttpListener:
(2). 使用GET获取内容
我们先讨论最简单的GET请求。GET请求只需向服务器发送一个URL,然后取得服务器响应即可。在HttpThread的run()方法中实现如下:
当下载完毕后,HttpWaitUI就获得了来自服务器的数据,要传递给下一个屏幕处理,HttpWaitUI必须包含对此屏幕的引用并通过一个setData(DataInputStream
input)方法让下一个屏幕能非常方便地读取数据。因此,定义一个DataHandler接口:
HttpWaitUI响应HttpThread的onFinish事件并调用下一个屏幕的setData方法将数据传递给它并显示下一个屏幕:
以下载一则新闻为例,一个完整的HTTP GET请求过程如下:
首先,用户通过点击某个屏幕的命令希望阅读指定的一则新闻,在commandAction事件中,我们初始化HttpWaitUI和显示数据的NewsUI屏幕:
NewsUI实现DataHandler接口并负责显示下载的数据:
服务器端只要以String, long,
String的顺序依次写入DataOutputStream,MIDP客户端就可以通过DataInputStream依次取得相应的数据,完全不需要解析XML之类的文本,非常高效而且方便。
需要获得联网数据的屏幕只需实现DataHandler接口,并向HttpWaitUI传入一个URL即可复用上述代码,无须关心如何连接网络以及如何处理用户中断连接。
(3).使用POST发送数据
以POST方式发送数据主要是为了向服务器发送较大量的客户端的数据,它不受URL的长度限制。POST请求将数据以URL编码的形式放在HTTP正文中,字段形式为fieldname=value,用&分隔每个字段。注意所有的字段都被作为字符串处理。实际上我们要做的就是模拟浏览器POST一个表单。以下是IE发送一个登陆表单的POST请求:
需要注意的是,数据仍需要以URL编码格式编码,由于MIDP库中没有J2SE中与之对应的URLEncoder类,因此,需要自己动手编写这个encode()方法,可以参考java.net.URLEncoder.java的源码。剩下的便是读取服务器响应,代码与GET一致,这里就不再详述。
使用multipart/form-data发送文件
如果要在MIDP客户端向服务器上传文件,我们就必须模拟一个POST
multipart/form-data类型的请求,Content-Type必须是multipart/form-data。
以multipart/form-data编码的POST请求格式与application/x-www-form-urlencoded完全不同,multipart/form-data需要首先在HTTP请求头设置一个分隔符,例如ABCD:
hc.setRequestProperty("Content-Type", "multipart/form-data; boundary=ABCD");
然后,将每个字段用“--分隔符”分隔,最后一个“--分隔符--”表示结束。例如,要上传一个title字段"Today"和一个文件C:/1.txt,HTTP正文如下:
--ABCD
Content-Disposition: form-data; name="title"
/r/n
Today
--ABCD
Content-Disposition: form-data; name="1.txt"; filename="C:/1.txt"
Content-Type: text/plain
/r/n
<这里是1.txt文件的内容>
--ABCD--
/r/n
请注意,每一行都必须以/r/n结束,包括最后一行。如果用Sniffer程序检测IE发送的POST请求,可以发现IE的分隔符类似于---------------------------7d4a6d158c9,这是IE产生的一个随机数,目的是防止上传文件中出现分隔符导致服务器无法正确识别文件起始位置。我们可以写一个固定的分隔符,只要足够复杂即可。
发送文件的POST代码如下:
(4). 使用Cookie保持Session
通常服务器使用Session来跟踪会话。Session的简单实现就是利用Cookie。当客户端第一次连接服务器时,服务器检测到客户端没有相应的Cookie字段,就发送一个包含一个识别码的Set-Cookie字段。在此后的会话过程中,客户端发送的请求都包含这个Cookie,因此服务器能够识别出客户端曾经连接过服务器。
要实现与浏览器一样的效果,MIDP应用程序必须也能识别Cookie,并在每个请求头中包含此Cookie。
在处理每次连接的响应中,我们都检查是否有Set-Cookie这个头,如果有,则是服务器第一次发送的Session ID,或者服务器认为会话超时,需要重新生成一个Session ID。如果检测到Set-Cookie头,就将其保存,并在随后的每次请求中附加它:
使用Sniffer程序可以捕获到不同的Web服务器发送的Session。WebLogic Server 7.0返回的Session如下:
Set-Cookie:
JSESSIONID=CxP4FMwOJB06XCByBWfwZBQ0IfkroKO2W7FZpkLbmWsnERuN5u2L!-1200402410;
path=/
而Resin 2.1返回的Session则是:
Set-Cookie: JSESSIONID= aTMCmwe9F5j9; path=/
运行ASP.Net的IIS返回的Session:
Set-Cookie: ASPSESSIONIDQATSASQB=GNGEEJIDMDFCMOOFLEAKDGGP; path=/
我们无须关心Session ID的内容,服务器自己会识别它。我们只需在随后的请求中附加上这个Session ID即可:
if(session!=null)
hc.setRequestProperty("Cookie", session);
对于URL重写来保持Session的方法,在PC客户端可能很有用,但是,由于MIDP程序很难分析出URL中有用的Session信息,因此,不推荐使用这种方法。
分享到:
相关推荐
【J2ME联网不同运营商网络方案】 在移动应用开发领域,J2ME(Java Micro Edition)扮演了重要的角色,尤其在网络通信方面。随着3G网络的普及,中国移动、联通、电信三大运营商为J2ME应用提供了丰富的网络环境。本文...
在Java 2 Micro Edition (J2ME)平台上开发应用程序时,常常会遇到用户需要等待联网操作或线程执行完毕的情况,比如数据下载、文件上传等。这种情况下,为用户提供一个可视化的进度条能够显著提高用户体验,让用户...
本文将详细介绍如何使用J2ME的通用联网框架来开发联网应用。 首先,MIDP(Mobile Information Device Profile)是J2ME的一个子集,它定义了移动设备的基本功能,包括用户界面、存储、输入输出以及网络连接。MIDP...
- **J2ME**: J2ME是一种简化版的Java平台,专为资源受限的设备设计,如早期的智能手机和平板电脑。它包含了几个配置和 profiles,如MIDP(Mobile Information Device Profile)和CLDC(Connected Limited Device ...
**J2ME文件浏览器(MIDP版本)详解** J2ME,全称为Java 2 Micro Edition,是Java平台的一个子集,专为资源有限的移动设备如手机、嵌入式系统等设计。MIDP(Mobile Information Device Profile)是J2ME的一部分,...
### J2ME最佳实践与UI设计关键知识点 #### 一、J2ME概述与MIDP版本 J2ME(Java 2 Micro Edition),由Sun Microsystems发布,是为小型设备和消费类电子产品设计的Java平台标准。其核心是MIDP(Mobile Information ...
**J2ME文件浏览器(LWUIT版)详解** J2ME(Java 2 Micro Edition)是Java平台的一个子集,主要用于嵌入式设备和移动设备的开发,如早期的智能手机和平板电脑。在J2ME中开发应用程序,开发者经常需要处理文件系统...
KEmulator Lite V0.9.8是其中的一款,它是一个功能相对简单但实用的免费J2ME模拟器,特别适合于那些想体验旧版应用程序或者进行开发测试的用户。 KEmulator Lite V0.9.8中文版提供了友好的界面和兼容性,让用户可以...
**J2ME教材:J2ME&Gaming中文版** J2ME,全称为Java 2 Micro Edition,是Java平台的一个子集,主要用于嵌入式设备和移动设备,如手机、智能手表等。这个“J2ME&Gaming中文版”教材主要针对的是Java在游戏开发领域的...
基于java的开发源码-J2ME黑白棋游戏手机版 v2.1完整源码.zip 基于java的开发源码-J2ME黑白棋游戏手机版 v2.1完整源码.zip 基于java的开发源码-J2ME黑白棋游戏手机版 v2.1完整源码.zip 基于java的开发源码-J2ME黑白棋...
### J2ME最佳实践:构建高效且兼容性强的MIDP应用程序 J2ME,即Java 2 Platform, Micro Edition,是由Sun Microsystems为小型设备和嵌入式设备设计的Java平台,尤其适用于移动电话和PDAs等小型电子设备。本文旨在...
【J2ME雷电游戏改写版】是一个基于Java 2 Micro Edition(J2ME)平台的游戏项目,它对经典雷电系列游戏进行了部分改编。虽然改写并未深入到每一个细节,但仍然对于想要了解J2ME游戏开发的初学者来说具有一定的学习...
**J2ME游戏编程概述** Java 2 Micro Edition (J2ME) 是一种Java平台,专为嵌入式设备和移动设备设计,如早期的智能手机、功能手机和各种物联网设备。J2ME提供了轻量级的运行环境和API,使得开发者能够创建在这些...
郭克华的《J2ME移动开发》PDF版是一份重要的学习资源,它专注于Java Micro Edition(J2ME)技术,这是Java平台的一个版本,主要用于嵌入式设备和移动电话的开发。J2ME为开发者提供了在小型设备上构建应用程序的能力...
**J2ME中文版教程——全面解读移动设备编程** J2ME(Java 2 Micro Edition)是Java平台的一个重要组成部分,专为嵌入式设备、移动电话和其他资源有限的设备设计。这个J2ME中文版教程是针对初学者和有一定经验的...
"J2ME开发.pdf"可能包含J2ME的详细教程或者最佳实践,涵盖从基础语法到高级特性的讲解,包括UI设计(如Form和Canvas类)、数据持久化(RecordStore)、网络编程(HttpConnection和Socket)以及事件处理等。...
《J2ME金山词霸完美版原码解析》 J2ME,全称为Java 2 Micro Edition,是Java平台的一个子集,专为资源有限的移动设备如手机、PDA等设计。它提供了开发和部署嵌入式及移动设备应用程序的能力,而"j2me金山词霸完美版...
J2ME教程中文版是学习J2ME编程的重要资源,涵盖了从基础概念到高级特性的全方位讲解。对于想要进入移动开发领域的Java开发者来说,理解J2ME的配置、Profile、MIDP、MIDlet、GUI、网络编程和文件系统是必不可少的步骤...
《J2ME&Gaming中文版》是一本专注于在无线设备上使用Java 2 Micro Edition (J2ME) 进行游戏开发的专业书籍。J2ME是Java平台的一个子集,设计用于资源有限的嵌入式设备,如早期的智能手机和功能手机,以及一些家用...
EclipseME插件的最新版本,用Eclipse开发J2ME的最佳搭档! 1.5.0版对设备管理部分进行了大刀阔斧的重构,配置更加方便,对各厂商无线工具包的支持更加灵活。 EclipseME的英文文档已全部翻译成中文,并获得作者...