background image

Java 编程:j2me 中的网络连接

J2me 提供了 HttpConnection 和 SocketConnection。前者从 API 级提供了对 http 协议
的支持,而后者只是单纯的一个 socket 流 API  

实际上对于使用 Http 协议的上层应用来说,网络层使用 Http 或者 Socke 应该是透明的。

 

作为框架,应该为用户提供方便的选择方式。
J2me 中对 HTTP 1.2 中定义的 KEEPALIVE 支持得并不是很好,并不能获得一个 http 的
长连接。对于 JSE 中 http connection 的实现还没验证。

使用 Socket 的一个好处是可以避免为每个网络请求建立单独的 Connection。并且因为
socket 的 inputStream, outputStream 是双工的方式工作,所以可以连续的发送网络

 

请求而不必等待网络回应。
如 果 让 socket 的 inputStream/outputStream 以 双 工 的 方 式 工 作 ( 即 : 通 过
outputStream

 

发送之后不等待 inputStream 的 response),那么需要应用层的协议

进 行支 持。 比如 ,需 要对 发出 的网 络请 求进 行编 号, 这样 从 inputstream 中获得 
response 的时候可以把这个回应匹配到正确的请求上。实现双工,很直接的想法是
inputStream、outputStream

 

分别由单独的一个线程处理。

 

这个工具包应该能够做到支持:

Http GET/POST  

File download  

可以选择使用 socket 或是 Http  

支持同步/异步(阻塞/非阻塞)发送请求,提供 timeout

 

机制;

 

清晰的异常定义,方便上层进行错误处理。
对于 socket 是否可用连接池?[对于 j2me 程序似乎没有必要] 

Connection 中的 receive, send 都是阻塞的。如果要实现异步收发,需要在一个单独的

 

线程中处理请求。

以下是通过把阻塞的 API 放在一个线程中运行而获得的异步效果。理想状态下,在到达了
Timeout 事件后,应该把这个线程关闭。但是因为这个线程中存在阻塞方法,所以不能
及时地获得停止通知(很难终止这个线程)。这个网络请求很可能会在你设置的 timeout
时间后获得网络 response

 

。为了处理 timeout 之后仍旧获得网络数据的情况,可以先把

异步请求的数据对象放到一个队列中,如果网络回应在 timeout 之前返回,则从这个队

 

列中查找该对象并移走这个对象; 当 timeout 之后,也应该把这个对象移走(可考虑放
到另一个队列进行其它的特殊处理),这样当延迟的网络回应到来后,从队列中找不到