`
duyouhua1214
  • 浏览: 238171 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

J2ME中多线程网络连接编程的分析

    博客分类:
  • j2me
阅读更多

摘 要 介绍并分析了J2ME的通用网络连接框架(GCF),并以此为基础,指出了在J2ME网络连接编程中存在的问题,并提出了通过构建多线程的两种解决方法。

  关键词 J2ME GCF多线程 网络连接

  引言
 
  J2ME(Java 2 Micro Edition)是Java 2的一个组成部分,它与J2SE、J2EE并称。J2ME是一种高度优化的Java运行环境,主要针对消费类电子设备的,例如蜂窝电话、可视电话、数字机顶盒和汽车导航系统等等。即J2ME是为消费电子产品和手持设备量身定制的Java专用版本。
J2ME的出现使开发跨平台的消费类电子产品的应用软件成为可能。Java语言的与平台无关的特性移植到小型电子设备上,允许移动无线设备之间共享应用程序。它提供了基于HTTP的高级Internet协议,使移动电话能以Client/Server方式直接访问Internet的全部信息,从而使得不同的Client访问不同的资源。

  在将来的无线通信时代中,大量的网络应用程序将被开发出来去满足无线移动通讯的要求,而要充分的发挥无线移动通讯设备的通信能力,J2ME网络编程就变得尤为重要。那么为了高效地进行网络编程,就要利用Java语言的多线程编程机制。

  1、J2ME的网络连接框架(GCF)

  通用连接框架(Generic Connection Framework,GCF)为资源有限的设备提供了一个可扩展的、通用的I/O 框架。GCF 是一组在 javax.microedition.io 包中定义的接口。图 1 显示了 GCF 的类层次结构。


图1 GCF 的类层次结构
  在 GCF 中共定义了七个接口 ,其中 Connection 是最基本的连接类型。且同时提供了对数据包和流连接的支持。沿着层次结构向下派生出提供更多功能的接口。例如, StreamConnection 接口支持输入流和输出流, ContentConnection接口又扩展了 StreamConnection 接口以支持对流的内容类型、数据长度和编码格式的确定,HttpConnection接口又扩展了ContentConnection接口以支持对于标准的HTTP请求。如在框架层规定的适用于手机或双向寻呼机的移动信息设备框架MIDP(Mobile Information Device Profile)在其MIDP 1.0 规范只要求设备支持 HTTP 连接协议,而更新的 MIDP 2.0 规范要求同时支持 HTTP 和 HTTPS,后者提供了对更安全的网络连接的支持。

  2、网络编程中的多线程

  由于目标设备具有内存小,计算能力弱和电池供电等特点,所以如何使应用程序高效的运行就成为开发中的一个大问题.尤其针对手机等移动信息设备时,无线通讯的特点又对我们的程序提出了更高的要求.从代码优化的角度,在网络编程中引入多线程就显得十分重要。

  当程序运行的时候,Application Management Software(应用管理软件)首先初始化一个MIDlet,然后调用它的startApp()方法使得MIDlet进入active状态,这条程序分支就是主线程,它执行其他的方法后都会返回到这个分支上来继续执行。然而网络连接是个可能堵塞的操作,意味着它可能长时间都不返回。

  在SUN公司的无线开发包WTK中模拟一段网络连接程序运行时,WTK会提示网络连接工作可能会堵塞用户输入,需要创建另外一个线程去进行联网操作。针对以上情况,引入多线程的处理机制。

  2.1 利用Thread类与Runnable接口

  编写J2ME网络连接应用程序的时候往往借助Command显示部件,调用其事件处理函数完成网络的连接工作,代码框架如下:

public void commandAction(Command c, Displayable s) {
 if(c==sendCommand){
  requestConnect();//连接方法
 }
 else if(
  c==backCommand){
   display.setCurrent(mainForm); }
 else{
  destroyApp(false);
  notifyDestroyed(); }
}
// 获取一个HTTP的连接
private void requestConnect() {
 String url= URL.URLString
 HttpConnection hpc = null;
 try{
  hpc = (HttpConnection)Connector.open(url);
  int status = hpc.getResponseCode();
  if(status != HttpConnection.HTTP_OK)
   content = "联机失败!";
  else
   content = "已联机!";
 }
 catch(IOException e){System.out.println(content);}
 try{
  if(hpc != null) hpc.close();
 }
 catch(IOException e2){}}
  上面的程序工作原理可用图2的工作原理图a来表示。


图2 工作原理图a


  分析图2可以得出,如果这样的网络连接程序在手机上运行,那么将可能长时间得不到响应。因为连接工作只有一个主线程,所有的应用都是在这个主线程当中进行的,如果此主线程不返回,那么就不能进行后面的行为,用户也不能进行任何操作。

  下面改进一下程序,创建一个实现Runnable接口的ConnectPipe类来创建多线程。代码如下:

//实现Runnable接口
class ConnectPipe implement Runnable{
 ……
 public void run(){
  requestConnect();}
}
  修改commandAction函数:

public void commandAction(Command c, Displayable s) {
 if(c==sendCommand){
  //创建新线程
  new Thread(new ConnectPipe()).start();
 }
 else if(c==backCommand){
  ……
 }
}
  修改之后程序能够较为顺利的运行,当处理网络连接的时候,启动一个线程后主线程会立刻返回,两个线程并行,不会引发在此地堵塞。其工作原理可用图3的工作原理图b来表示。


图3 工作原理图b
  详细分析图3,又发现尽管程序可以正常工作,但是每次用户按下按钮的时候都会有新的线程产生,这样显然不够高效,同时,异步的行为又有可能使两个线程间产生死锁。幸好java中提供了wait()和notify()/notifyAll()来进行线程间的通讯,协调同步问题。那么对应本程序中的线程同步问题,设计思想如下:启动线程后,让其进入等待的状态,当用户激活Command事件的时候唤醒线程,才让其继续运行。代码类似如下:

public synchronized void run() {
 while (dealing) {
  try { wait(); }//线程等待
  catch (InterruptedException ie) {}
  if (dealing) requestConnect();
 }
}
public synchronized void deal() {
 notify();//唤醒线程
}
  其中dealing变量用于定义一个锁,当其为true时,当前线程等待,直到用户激活Command事件之后,调用deal()方法中的notify()唤醒当前线程继续运行。这样程序就显得相当的高效,也在很大程度上避免了线程间的死锁问题。其工作原理可用图4的工作原理图c来表示。


图4 工作原理图c
  2.2 利用系统类Timer和TimerTask

  系统类Timer类是一个计时器,和TimerTask类结合可以来实现在MIDlet中定时执行特定任务。需要说明的是每一个Timer对象实际上都是一个后台运行的独立的线程。这是因为调度一次的任务都是由TimerTask类的实现对象负责,TimerTask类是一个抽象类,它的主要特点是实现了Runnable接口,因此扩展了必须实现的public void run()方法。

  所以,在J2ME的网络编程中,我们可以利用Timer类和TimerTask类来建立线程,完成网络连接等工作。设计思想如下:创建一个Timer类计时器,一个完成网络连接功能的TimerTask类,在系统空闲时,反复调度任务要求连接,直到连接成功,再调用TimerTask类的cancel()可以停止一个具体的调度任务。核心代码类似如下:

class ConnectTimer implement TimerTask{
 ConnectTimer (){
  m_Timer = new Timer();//定义Timer
  m_Timer.schedule(this,500,5000); //调度任务
 }
 ……
 public synchronized void run(){
  requestConnect();//连接方法
  cancel();//取消任务
 }
}

public void commandAction(Command c, Displayable s) {
 if(c==sendCommand){
  new ConnectTimer;}
 else if(c==backCommand){
  ……
 }
}
  3、结束语

  综上所述,在J2ME的应用开发中网络程序的设计具有重要的地位,而编程的关键又在于编写高效友好的J2ME网络连接程序。通过Java语言内置的多线程处理机制,利用线程进行同步并行处理,解决了网络连接时的阻塞问题,达到了程序高效运行的目的。

 

来源:http://www.grzz.com.cn/program/jsp/3779/

分享到:
评论

相关推荐

    J2ME里面的线程和网络

    在Java Micro Edition (J2ME)中,线程和网络编程是两个至关重要的概念,尤其对于开发移动设备上的应用程序来说。J2ME为资源有限的设备提供了轻量级的Java平台,因此理解和掌握这两个主题是编写高效、响应式以及能够...

    J2ME GPRS 网络编程

    J2ME GPRS网络编程的核心在于理解如何在移动设备上构建应用程序,以利用GPRS网络连接互联网并进行数据交换。以下是一些关键知识点: 1. **KJava与MIDP**: J2ME包含两种主要配置,KJava和MIDP(Mobile Information ...

    j2me网络编程以及网络游戏的实现.doc

    J2ME在网络编程中的作用主要体现在其支持HTTP等高级Internet协议,使得移动设备能够以客户端/服务器模式直接访问互联网资源。这一特性为开发无线通信时代的网络应用奠定了基础。例如,用户可以通过手机这样的移动...

    j2me使用udp的简单连接

    需要注意的是,由于J2ME环境可能没有多线程支持,所以这个简单的示例是单线程的,如果有多个客户端同时连接,服务器可能无法处理。 接下来是`Client.java`,客户端主要负责向服务器发送数据,并接收服务器的响应。...

    Socket编程在J2ME中的应用

    Socket编程在J2ME中的应用主要涉及到网络通信的基础知识,特别是Java Micro Edition (J2ME) 平台上的网络编程。J2ME是Java平台的一个子集,主要用于嵌入式设备和移动设备,如手机、PDA等。在这个场景下,Socket编程...

    网络扑克 j2me 程序

    总结起来,网络扑克j2ME程序的开发涵盖了网络编程、用户界面设计、多线程管理、数据结构与算法运用、游戏逻辑实现、安全性保障、资源管理以及性能优化等多个方面,体现了j2ME平台在移动游戏开发中的应用潜力。...

    j2me_plane.rar_j2me_j2me 飞机_j2me 飞机 游戏_飞机游戏

    在飞机游戏中,我们可能会用到MIDP(Mobile Information Device Profile)配置,它是J2ME中最常见的手机应用开发平台,提供了用户界面组件、网络连接等功能。同时,CLDC(Connected Limited Device Configuration)...

    j2me手机编程笔记

    总结,J2ME手机编程涉及了从基础环境配置到实际编程实践的多个层面,包括虚拟机、应用结构、UI设计、网络通信和数据管理等方面。掌握这些知识点,开发者可以创建出在各种移动设备上运行的应用程序。

    J2ME的Socket编程

    - Socket 编程中,必须处理各种可能的网络异常,如 `UnknownHostException`、`IOException` 和 `SocketException`。这些异常可能由网络中断、服务器不可达或端口错误等引起。 6. **关闭资源**: - 在完成数据交换...

    J2ME手机游戏开发(可蓝牙对战网络编程)

    总的来说,"J2ME手机游戏开发(可蓝牙对战网络编程)"项目涵盖了J2ME游戏开发的多个重要方面:图形渲染、蓝牙通信、网络编程以及游戏逻辑。通过学习和实践,开发者不仅可以掌握J2ME的基本技术,还能深入了解手机游戏...

    j2me手机基于服务器的网络象棋游戏源代码

    4. 多线程处理:服务器端可能需要多线程来处理多个玩家的连接。 5. 数据持久化:保存和加载游戏状态,以便在需要时恢复。 6. 安全性:确保游戏数据的安全,防止未授权访问和篡改。 开发者在实现这样的项目时,还...

    J2ME 中文教程 MIDP2.0

    - **连接性增强**:支持更多的网络协议,如HTTP和HTTPS,以及SSL/TLS加密,增强了安全性和网络通信能力。 - **XML解析器**:内置XML解析器,便于处理XML数据。 - **Java虚拟机优化**:提升了性能,减少了内存占用。 ...

    J2ME编程源代码(书中代码)

    - 在J2ME中,多线程是实现并行操作的关键,比如游戏的动画和用户交互可以分别在不同的线程中运行。 7. **性能优化** - 由于J2ME的目标设备通常资源有限,因此代码优化是必要的。例如,避免不必要的对象创建,使用...

    j2me中文教程

    - MIDlet Suite:一个或多个MIDlets(J2ME应用程序)的集合。 - MIDlet:运行在J2ME设备上的主应用程序类。 - Display:负责显示用户界面的类。 - Form:用于创建表单的组件。 - Item:构成表单的基本元素,如...

    郭克华J2ME实例教程完整版之Socket编程

    Socket编程是J2ME中实现设备间网络通信的核心技术,对于开发移动应用、物联网设备控制等场景至关重要。 J2ME是Java平台的一个子集,主要针对嵌入式和移动设备,如手机、智能手表等。在J2ME中,Socket编程允许应用...

    j2me手机高级编程

    8. **Chapter 11(ch11):高级主题**:这可能涉及J2ME的更多高级特性,如多线程编程,以提高应用性能,或者如何优化代码以适应资源有限的移动环境。 通过这些章节的源代码,开发者可以深入理解J2ME的各个方面,并...

    线程池技术在J2ME网络通信中的应用研究

    本文聚焦于线程池技术在J2ME网络通信中的应用,旨在通过优化多线程管理,提高网络通信效率,同时减少资源消耗。 #### J2ME网络通信中的多线程挑战 在J2ME环境下,网络通信通常需要在独立的线程中执行,以确保主线...

    j2me五子棋网络对战 源代码

    【标题】"j2me五子棋...通过分析这个项目的源代码,开发者可以学习到J2ME环境下的游戏开发、网络编程、多线程处理以及游戏逻辑的设计等多个方面的知识。这对于想要从事移动游戏开发的人来说,是一个宝贵的教育资源。

    J2ME数据库编程J2ME数据库编程.ppt

    为了优化性能,应尽量减少对 Record Store 的读写操作,尤其是在网络连接不稳定或资源有限的移动设备上。批量处理记录(如一次性添加或更新多个记录)通常比单个处理更有效率。另外,定期备份 Record Store 数据以...

    J2me手机游戏编程入门

    压缩包中的"j2me-Examples"可能包含了一些示例代码,这些代码可以帮助初学者更好地理解和应用上述知识点,通过分析和修改这些示例,可以快速上手J2ME游戏开发。 总的来说,J2ME手机游戏编程是一门既具有挑战性又...

Global site tag (gtag.js) - Google Analytics