管理博客 ┆ 搜索 ┆ 帮助
j2me中的网络连接(上)
作者:老师 2008-04-17 16:42:10
标签:
 
成都游戏学院 http://www.cdgamecollege.org 电话:028-85586115 
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分别由单独的一个线程处理。

  



    这个工具包应该能够做到支持:
  1. Http GET/POST;
  2. File download;
  3. 可以选择使用socket或是Http;
  4. 支持同步/异步(阻塞/非阻塞)发送请求,提供timeout机制;
  5. 清晰的异常定义,方便上层进行错误处理。
  6. 对于socket是否可用连接池?[对于j2me程序似乎没有必要]



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



    以下是通过把阻塞的API放在一个线程中运行而获得的异步效果。理想状态下,在到达了Timeout事件后,应该把这个线程关闭。但是因为这个线程中存在阻塞方法,所以不能及时地获得停止通知(很难终止这个线程)。这个网络请求很可能会在你设置的timeout时间后获得网络response。为了处理 timeout之后仍旧获得网络数据的情况,可以先把异步请求的数据对象放到一个队列中,如果网络回应在timeout之前返回,则从这个队列中查找该对象并移走这个对象;  当timeout之后,也应该把这个对象移走(可考虑放到另一个队列进行其它的特殊处理),这样当延迟的网络回应到来后,从队列中找不到对象,就不做处理。

       

    sendRequestSynch是同步的API。 sendRequest()会调用同步方法,因此放在一个单独的线程中运行。匿名线程t启动之后,通过request.wait()方法,使调用 sendRequestSynch()的方法被阻塞。从request.wait()方法恢复之后,判断是否timeout发生。

    public void sendRequestSynch(final NetworkRequest request, long timeout) throws Exception {

        synchronized (request) {

             Thread t = new Thread() {

                 public void run() {

                     try {

                         log.debug("send request in another thread.");

                         sendRequest(request);

                     }catch (Exception e) {

                         log.warn(e.getMessage());

                    }

                    log.debug("Exit the thread.");

                 }

             };

             t.start();   

             

             log.debug("Try to wait for " + timeout);

             request.wait(timeout);

             if (request.isDelayed()) {

                 queue.removeElement(request);

                 timeoutQueue.addElement(request);

                 log.debug("Request TIMEOUT !!!!!!!!!!!!!!!!");

                 log.debug("Stop the network request thread for the timeout.");

             }else {

                 log.debug("Be Notified and wakeup.");

             }

        }

    }

本文仅为提供更多信息,不代表新浪BLOG同意其观点或描述。如需转载请注明出处。