`
xwz0528
  • 浏览: 45313 次
  • 性别: Icon_minigender_1
  • 来自: 日照
社区版块
存档分类
最新评论

J2ME无线联网技术

阅读更多

J2ME无线联网技术

 

 

 

     首先看一下GCF框架体系,如下图所示:



      CLDC只是定义了基于底层通信协议(如传输流或数据报等)的网络连接中的一些接口定义,至于具体某种高层协议

的网络连接一般在简表中定义,因为不同的设备支持的高层网络通信协议是不一样的,因此完全没必要在CLDC配置中来定义。
      在专门针对移动信息设备的MIDP简表中,定义了ServerSocketConnection、SocketConnection、UDPDatagramConnection和HttpConnection接口来提供对高层网络协议的网络通信进行支持。其中HttpConnection是MIDP规定设备必须支持的。

      因此,可以总结出我们需要掌握的方面:使用Http连接Internet、开发Socket网络连接应用、开发Datagram网络连接应用,下面着重讲解前两种。

 

 

      1.使用Http连接Internet

      我写了一个使用Http从http://life.yule.com.cn/UploadPic/2008-1/200814142026328.jpg下载并显示图片的例子。代码如下:

 

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.microedition.io.*;
import java.io.*;


public class ViewImage extends MIDlet implements CommandListener{

	private Display dis;
	private TextBox tbMain;
	private Alert alStatus;
	private Form fm;
	private Command cmExit;
	private Command cmView;
	private Command cmBack;
	private static final int ALERT_DISPLAY_TIME =3000;
	Image im=null;
	
	public ViewImage() {
		// TODO Auto-generated constructor stub
		dis=Display.getDisplay(this);
		tbMain=new TextBox("输入图片地址","http://life.yule.com.cn/UploadPic/2008-1/200814142026328.jpg",75,0);
		cmExit=new Command("退出",Command.EXIT,1);
		cmView=new Command("下载",Command.SCREEN,2);
		tbMain.addCommand(cmExit);
		tbMain.addCommand(cmView);
		tbMain.setCommandListener(this);
		
		fm=new Form("");
		cmBack=new Command("后退",Command.BACK,1);
		fm.addCommand(cmBack);
		fm.setCommandListener(this);
	}

	protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
		// TODO Auto-generated method stub

	}

	protected void pauseApp() {
		// TODO Auto-generated method stub

	}

	protected void startApp() throws MIDletStateChangeException {
		// TODO Auto-generated method stub
		dis.setCurrent(tbMain);
	}

	public void commandAction(Command c,Displayable s)
	{
		if(c==cmExit)
		{
			try{
				destroyApp(false);
				notifyDestroyed();
			}catch(Exception e){
				
			}
		}else if(c==cmView)
		{
			showAlert("下载中",false,tbMain);
			Thread dl=new Download(tbMain.getString(),this);
			dl.start();
		}
		else if(c==cmBack)
		{
			dis.setCurrent(tbMain);
		}
			
	}
	
	public void showImage(boolean flag)
	{
		if(flag==false)
		{
			showAlert("下载失败",true,tbMain);
		}
		else
		{
			ImageItem ii=new ImageItem(null,im,ImageItem.LAYOUT_CENTER,null);
			if(fm.size()!=0)
				fm.set(0, ii);
			else 
				fm.append(ii);
			showAlert("下载成功",true,fm);
		}
	}
	public void showAlert(String msg,boolean modal,Displayable displayable)
	{
		alStatus=new Alert("状态",msg,null,AlertType.INFO);
		if(modal)
		{
			alStatus.setTimeout(Alert.FOREVER);
		}
		else
		{
			alStatus.setTimeout(ALERT_DISPLAY_TIME);
			
		}
		dis.setCurrent(alStatus, displayable);
	}
	class Download extends Thread
	{
		private String url;
		private ViewImage Midlet;
		private boolean downloadSuccess=false;

		public Download(String url,ViewImage Midlet)
		{
			this.url=url;
			this.Midlet=Midlet;
		}
		
		public void run() {
			// TODO Auto-generated method stub
			try{
				getImage(url);
			}catch(Exception e){
				
			}
		}
		
		private void getImage(String url) throws IOException
		{
			ContentConnection connection=(ContentConnection)Connector.open(url);
			DataInputStream iStrm=connection.openDataInputStream();
			ByteArrayOutputStream bStrm=null;
			Image im=null;
			
			try{
				byte[] imageData;
				int length=(int)connection.getLength();
				if(length!=-1)
				{
					imageData=new byte[length];
					iStrm.readFully(imageData);
				}
				else
				{
					bStrm=new ByteArrayOutputStream();
					int ch;
					while((ch=iStrm.read())!=-1)
					{
						bStrm.write(ch);
					}
					imageData=bStrm.toByteArray();
				}
				im=Image.createImage(imageData, 0, imageData.length);
			}
			finally{
				if(connection!=null)
					connection.close();
				if(iStrm!=null)
					iStrm.close();
				if(bStrm!=null)
					bStrm.close();
			}
			if(im==null)
				Midlet.showImage(false);
			else 
			{
				Midlet.im=im;
				Midlet.showImage(true);
			}
		}
		
	}
}

 最终显示结果如下图所示:



 

 

注:1.ContentConnection connection=(ContentConnection)Connector.open(url);

为什么用ContentConnection 而不用HttpConnection ,个人认为应该可以,没有试验,有时间验证一下。

      2.

byte[] imageData;
				int length=(int)connection.getLength();
				if(length!=-1)
				{
					imageData=new byte[length];
					iStrm.readFully(imageData);
				}
				else
				{
					bStrm=new ByteArrayOutputStream();
					int ch;
					while((ch=iStrm.read())!=-1)
					{
						bStrm.write(ch);
					}
					imageData=bStrm.toByteArray();
				}
				im=Image.createImage(imageData, 0, imageData.length);

 

不是很明白!

 

 

 

      2.开发Socket网络连接应用

      我做的是一个聊天软件,有服务端和客户端,代码如下:

Server.java

import java.io.*;
import javax.microedition.io.*;
import javax.microedition.lcdui.*;


public class Server implements Runnable,CommandListener {

	private SocketMidlet parent;
	private Display dis;
	private Form f;
	private StringItem si;
	private TextField tf;
	private boolean stop;
	private Command sendCommand=new Command("发送",Command.OK,1);
	private Command exitCommand=new Command("退出",Command.EXIT,1);
	InputStream is;
	OutputStream os;
	SocketConnection sc;
	ServerSocketConnection scn;
	Sender sender;
	
	public Server(SocketMidlet m) {
		// TODO Auto-generated constructor stub
		parent=m;
		dis=Display.getDisplay(parent);
		f=new Form("Socket服务器端");
		si=new StringItem("状态:","");
		tf=new TextField("发送:","",30,TextField.ANY);
		f.append(si);
		f.append(tf);
		f.addCommand(exitCommand);
		f.setCommandListener(this);
		dis.setCurrent(f);
		
		this.start();
	}

	public void start()
	{
		Thread t=new Thread(this);
		t.start();
	}
	
	public void run() {
		// TODO Auto-generated method stub
		try{
			
			si.setText("等待客户端连接");
			scn=(ServerSocketConnection)Connector.open("socket://:50009");
			sc=(SocketConnection)scn.acceptAndOpen();
			si.setText("Connection accepted");
			is=sc.openInputStream();
			os=sc.openOutputStream();
			sender=new Sender(os);
			f.addCommand(sendCommand);
			while(true)
			{
				StringBuffer sb=new StringBuffer();
				int c=0;
				while(((c=is.read())!='\n')&&(c!=-1))
				{
					sb.append((char)c);
				}
				if(c==-1) break;
				si.setText("接收到的消息:"+ sb.toString());
			}
			stop();
			si.setText("连接已经关闭");
			f.removeCommand(sendCommand);
			
		}catch(IOException ioe){
			
			if(ioe.getMessage().equals("ServerSocket Open"))
			{
				Alert a=new Alert("Server","端口可能已经被占用",null,AlertType.ERROR);
				a.setTimeout(Alert.FOREVER);
				a.setCommandListener(this);
				dis.setCurrent(a);
			}
			else if(!stop)
			{
				ioe.printStackTrace();
			}
			
		}catch(Exception e)
		{
			
		}
	}

	public void stop()
	{
		try{
			
			stop=true;
			if(is!=null)
				is.close();
			if(os!=null)
				os.close();
			if(sc!=null)
				sc.close();
			if(scn!=null)
				scn.close();
			
		}catch(Exception e){
			
		}
	}
	public void commandAction(Command c, Displayable s) {
		// TODO Auto-generated method stub
		if(c==sendCommand&&!parent.isPaused())
			sender.send(tf.getString());
		if((c==Alert.DISMISS_COMMAND)||c==exitCommand)
		{
			try{
				parent.notifyDestroyed();
				parent.destroyApp(true);
			}catch(Exception e){
				
			}
		}
	}

	

}

 

Cilent.java

import java.io.*;
import javax.microedition.io.*;
import javax.microedition.lcdui.*;


public class Client implements Runnable,CommandListener {

	private SocketMidlet parent;
	private Display dis;
	private Form f;
	private StringItem si;
	private TextField tf;
	private boolean stop;
	private Command sendCommand=new Command("发送",Command.OK,1);
	private Command exitCommand=new Command("退出",Command.EXIT,1);
	InputStream is;
	OutputStream os;
	SocketConnection sc;

	Sender sender;
	
	public Client(SocketMidlet m) {
		// TODO Auto-generated constructor stub
		parent=m;
		dis=Display.getDisplay(parent);
		f=new Form("Socket服务器端");
		si=new StringItem("状态:","");
		tf=new TextField("发送:","",30,TextField.ANY);
		f.append(si);
		f.append(tf);
		f.addCommand(exitCommand);
		f.setCommandListener(this);
		dis.setCurrent(f);
		
		this.start();
	}

	public void start()
	{
		Thread t=new Thread(this);
		t.start();
	}
	
	public void run() {
		// TODO Auto-generated method stub
		try{
			

			sc=(SocketConnection)Connector.open("socket://localhost:50009");
			si.setText("已经连接到服务器");
			is=sc.openInputStream();
			os=sc.openOutputStream();
			sender=new Sender(os);
			f.addCommand(sendCommand);
			while(true)
			{
				StringBuffer sb=new StringBuffer();
				int c=0;
				while(((c=is.read())!='\n')&&(c!=-1))
				{
					sb.append((char)c);
				}
				if(c==-1) break;
				si.setText("接收到的消息:"+ sb.toString());
			}
			stop();
			si.setText("连接已经关闭");
			f.removeCommand(sendCommand);
			
		}catch(ConnectionNotFoundException cnfe){
			
				Alert a=new Alert("Client","请先运行服务器节点",null,AlertType.ERROR);
				a.setTimeout(Alert.FOREVER);
				a.setCommandListener(this);
				dis.setCurrent(a);

		}catch(IOException ioe) 
		{
			if(!stop)
			{
				ioe.printStackTrace();
			}
			
		}catch(Exception e)
		{
			
		}
	}

	public void stop()
	{
		try{
			
			stop=true;
			if(is!=null)
				is.close();
			if(os!=null)
				os.close();
			if(sc!=null)
				sc.close();
		}catch(Exception e){
			
		}
	}
	public void commandAction(Command c, Displayable s) {
		// TODO Auto-generated method stub
		if(c==sendCommand&&!parent.isPaused())
			sender.send(tf.getString());
		if((c==Alert.DISMISS_COMMAND)||c==exitCommand)
		{
			try{
				parent.notifyDestroyed();
				parent.destroyApp(true);
			}catch(Exception e){
				
			}
		}
	}

	

}

 

Sender.java

import java.io.*;



public class Sender extends Thread {

	private OutputStream os;
	private String message;
	
	public Sender(OutputStream os) {
		// TODO Auto-generated constructor stub
		this.os=os;
		start();
	}
	
	public synchronized void send(String msg)
	{
		message=msg;
		notify();
	}

	public synchronized void run()
	{
		while(true)
		{
			if(message==null)
			{
				try{
					wait();
				}catch(Exception e){
					
				}
			}
			
			if(message==null) break;
			
			try{
				os.write(message.getBytes());
				os.write("\r\n".getBytes());
			}catch(Exception e){
				
			}
			message=null;
		}
	}
	
	public synchronized void stop()
	{
		message=null;
		notify();
	}
}

 

SocketMidlet.java

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;


public class SocketMidlet extends MIDlet implements CommandListener{

	private static final String SERVER="服务器";
	private static final String CLIENT="客户端";
	private static final String[] names={SERVER,CLIENT};
	private Display dis;
	private Form f;
	private ChoiceGroup cg;
	private boolean isPaused;
	private Server server;
	private Client client;
	private Command startCommand=new Command("启动",Command.OK,1);
	private Command exitCommand=new Command("退出",Command.EXIT,1);
	
	public SocketMidlet() {
		// TODO Auto-generated constructor stub
		dis=Display.getDisplay(this);
		f=new Form("Socket连接示例");
		cg=new ChoiceGroup("选择端点类型",Choice.EXCLUSIVE,names,null);
		f.append(cg);
		f.addCommand(startCommand);
		f.addCommand(exitCommand);
		f.setCommandListener(this);
		dis.setCurrent(f);
		
	}

	public boolean isPaused()
	{
		return isPaused;
	}
	
	protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
		// TODO Auto-generated method stub
		if(server!=null)
			server.stop();
		if(client!=null)
			client.stop();
	}

	protected void pauseApp() {
		// TODO Auto-generated method stub
		isPaused=true;
	}

	protected void startApp() throws MIDletStateChangeException {
		// TODO Auto-generated method stub
		isPaused=false;
	}

	public void commandAction(Command c, Displayable s) {
		// TODO Auto-generated method stub
		if(c==exitCommand)
		{
			try {
				destroyApp(false);
				notifyDestroyed();
			} catch (MIDletStateChangeException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}else if(c==startCommand)
		{
			String name=cg.getString(cg.getSelectedIndex());
			if(name.equals(SERVER))
			{
				server=new Server(this);
			}
			else if(name.equals(CLIENT))
			{
				client=new Client(this);
			}
		}
	}

}

 运行结果如下:



 

 

       3.开发Datagram网络连接应用

      大体上和开发Socket网络连接应用差不多,只是Socket是面向连接的,而他不是,我也没有认真看,呵呵!

  • 大小: 63.5 KB
  • 大小: 66.3 KB
  • 大小: 53.8 KB
  • 大小: 57.4 KB
  • 大小: 31.1 KB
分享到:
评论

相关推荐

    J2ME无线设备程序设计-.rar

    在J2ME无线设备程序设计中,首先我们需要理解其核心组件。主要包括Profile(配置)和Micro Edition Feature Set(微型版特性集),例如MIDP(Mobile Information Device Profile)和CLDC(Connected Limited Device ...

    J2ME无线设备编程

    在J2ME无线设备编程中,开发者可以利用Java语言来创建丰富的应用程序,这些程序能够在各种不同类型的移动设备上运行。以下是对J2ME编程涉及的主要知识点的详细解释: 1. **KVM (Java虚拟机)**:J2ME使用了轻量级的...

    j2ME无线编程开发基础与入门

    总的来说,J2ME无线编程是将Java技术应用于移动设备和嵌入式系统的专业领域,它涉及Java基础知识、J2ME架构、MIDP和CLDC、UI设计、网络编程以及性能优化等多个方面。通过深入学习和实践,开发者可以创建出跨平台、...

    精通J2ME无线编程.pdf

    《精通J2ME无线编程》是一本专注于Java Micro Edition(J2ME)开发技术的书籍,旨在帮助读者从初级到高级全面掌握J2ME的精髓。J2ME是Java平台的一个子集,专为资源有限的移动设备和嵌入式系统设计,如手机、智能手表...

    J2ME手机开发技术API

    **J2ME手机开发技术API**是针对Java Micro Edition(J2ME)平台的应用程序开发进行详细阐述的技术参考资料。J2ME是一种轻量级的Java平台,主要用于开发在小型电子设备上运行的应用程序,如早期的移动电话、PDA、智能...

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

    【J2ME手机基于服务器的网络象棋游戏源代码】是一种专门为移动设备设计的网络棋类游戏实现,它利用Java 2 Micro Edition (J2ME) 技术,让玩家能够在手机上与其他在线用户对战。J2ME是Java平台的一个轻量级版本,主要...

    j2me 中文教程 开发环境 J2ME语言

    发无线联网应用程序时,和以往有很大不同。 第八章“MIDP 2.0 安全体系结构” 将主要介绍MIDP 的安全体系模型,并结合一个具体的 实例来讲述MIDP2.0 安全模型的主要概念。 第九章“MIDP 2.0 Push 技术”介绍了如何...

    j2me开发框架介绍

    j2me 是一种用于开发无线应用程序的平台,它提供了一个灵活、强大和开放的开发环境。随着 j2me 的普及,出现了许多开源框架,旨在简化开发过程,提高开发效率。下面将介绍这些框架,並分析它们的特点和功能。 1. ...

    第十章无线网络开发--j2me开发.ppt

    本章将深入探讨J2ME中的联网技术,特别是通用连接框架(Generic Connection Framework, GCF)。 ### 10.1 J2ME联网技术简介 在Java Standard Edition (J2SE)中,我们通常使用`java.net`和`java.io`包中的类来处理...

    J2ME 中文版教程

    发无线联网应用程序时,和以往有很大不同。 第八章“MIDP 2.0 安全体系结构” 将主要介绍MIDP 的安全体系模型,并结合一个具体的 实例来讲述MIDP2.0 安全模型的主要概念。 第九章“MIDP 2.0 Push 技术”介绍了如何...

    J2ME 中文教程

    这要求我们在开发无线联网应用程序时,和以往有很大不同。 第八章“MIDP 2.0安全体系结构” 将主要介绍MIDP的安全体系模型,并结合一个具体的实例来讲述MIDP2.0安全模型的主要概念。 第九章“MIDP 2.0 Push ...

    J2me 实例讲解(郭克华)

    5. **网络编程**:J2ME支持通过无线网络进行数据传输,如HTTP和TCP/IP协议,这使得开发者可以构建能联网的应用,如游戏、天气预报应用等。 6. **文件系统**:在J2ME中,理解设备的本地存储和如何操作文件至关重要,...

    J2ME 做的象棋游戏以及论文(支持蓝牙联网PVP)

    蓝牙联网功能的实现则需要利用J2ME中的JSR-82(Java Bluetooth API),它提供了在设备之间建立无线连接的接口。开发者需要创建BluetoothServerSocket和BluetoothSocket来监听和建立连接,然后通过输入/输出流进行...

    坦克J2ME游戏khk'

    本书详细讲解了J2ME的图形用户界面、游戏线程、记录存储、通用联网架构等基础知识,还在以往MIDP1.0的基础上增补了2.0的新内容,并对这些新技术加以详细介绍,这些技术包括高级用户界面的新组件、GameAPI游戏开发...

    《J2ME手机游戏开发技术详解》随书光盘源码

    7. **网络功能**:J2ME支持无线通信,可以实现在线多人游戏、排行榜同步或其他联网功能。 8. **优化技巧**:针对移动设备的内存限制和处理器性能,学习如何优化代码、减少资源消耗,提升游戏性能。 9. **错误处理...

    基于J2ME MIDP的移动通信技术研究.pdf

    J2ME MIDP广泛应用于移动游戏、企业级应用(如邮件客户端、天气预报应用)以及各种联网服务,如社交媒体、在线购物等。 6. **挑战与未来** 尽管J2ME提供了强大的功能,但它也面临着性能限制、安全问题和不同设备...

    J2ME开发实例7.rar_j2me

    配置定义了基础的Java虚拟机(JVM)和核心库,而配置文件则添加了特定领域的功能,如无线通信、图形用户界面等。常见的配置文件有MIDP(Mobile Information Device Profile)和CLDC(Connected Limited Device ...

    J2ME 中文教程1.01a

    这要求我们在开发无线联网应用程序时,和以往有很大不同。 第八章“MIDP 2.0安全体系结构” 将主要介绍MIDP的安全体系模型,并结合一个具体的实例来讲述MIDP2.0安全模型的主要概念。 第九章“MIDP 2.0 Push ...

Global site tag (gtag.js) - Google Analytics