- 浏览: 45324 次
- 性别:
- 来自: 日照
最新评论
-
xwz0528:
4楼的问题我也遇到过,webservice.webxml.co ...
J2ME使用KSoap调用C#开发的Web Service -
heshan664754022:
请教一个问题import java.io.IOExceptio ...
J2ME使用KSoap调用C#开发的Web Service -
heshan664754022:
弄出来了,以前学习都是用java开发的,走的是8080端口,没 ...
J2ME使用KSoap调用C#开发的Web Service -
xwz0528:
你不是用VS创建的Web Service吗,Web Servi ...
J2ME使用KSoap调用C#开发的Web Service -
heshan664754022:
我想问下系统自动生成的这个http://tempuri.org ...
J2ME使用KSoap调用C#开发的Web Service
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是面向连接的,而他不是,我也没有认真看,呵呵!
发表评论
-
IIS发布asp.net网站
2010-09-08 12:49 1997由于asp.net的版本不正确,或者vs.net先于iis之前 ... -
SQL数据库数据类型详解
2010-08-17 08:04 911SQL数据库数据类型详解 数据类型 ... -
风行项目开发组----开始前的总结
2010-07-23 21:24 952开始前的总结 ... -
J2ME使用KSoap调用C#开发的Web Service
2010-07-23 21:08 3566J2ME使用KSoap调用C#开发的Web Service(1 ... -
.NET Framework 对 SOAP 格式的支持
2010-07-23 19:57 2596为 ASP.NET 创建 Web 服务的开发人员可以通过向各个 ... -
控制SOAP消息编码格式(SOAP Encoding Styles)
2010-07-23 19:43 4496SOAP编码格式是Web services ... -
J2ME音频播放
2010-07-22 16:28 1226J2ME音频播放 今天上午做了一个播放音乐 ... -
QQ后台运行,s40全机型支持!
2010-07-20 23:32 3908S40手机后台运行QQ是几代人的梦想,现在S40V5过后的手机 ... -
风行项目开发组----我的初步体验
2010-07-20 22:44 849我的初步体验 ... -
J2me开发PNG文件格式
2010-07-19 16:41 1373前几天学生面试时,面试官问到了PNG文件格式!转载一篇文章供 ... -
使Nokia手机S40支持后台运行
2010-07-19 11:27 3954下文依诺基亚5130为例,建议先看完文章末尾的【解惑】再阅读。 ... -
Nokia S40 sdk 各版本信息
2010-07-19 10:12 2357Nokia S40 sdk 各版本信息 Seri ...
相关推荐
在J2ME无线设备程序设计中,首先我们需要理解其核心组件。主要包括Profile(配置)和Micro Edition Feature Set(微型版特性集),例如MIDP(Mobile Information Device Profile)和CLDC(Connected Limited Device ...
在J2ME无线设备编程中,开发者可以利用Java语言来创建丰富的应用程序,这些程序能够在各种不同类型的移动设备上运行。以下是对J2ME编程涉及的主要知识点的详细解释: 1. **KVM (Java虚拟机)**:J2ME使用了轻量级的...
总的来说,J2ME无线编程是将Java技术应用于移动设备和嵌入式系统的专业领域,它涉及Java基础知识、J2ME架构、MIDP和CLDC、UI设计、网络编程以及性能优化等多个方面。通过深入学习和实践,开发者可以创建出跨平台、...
《精通J2ME无线编程》是一本专注于Java Micro Edition(J2ME)开发技术的书籍,旨在帮助读者从初级到高级全面掌握J2ME的精髓。J2ME是Java平台的一个子集,专为资源有限的移动设备和嵌入式系统设计,如手机、智能手表...
**J2ME手机开发技术API**是针对Java Micro Edition(J2ME)平台的应用程序开发进行详细阐述的技术参考资料。J2ME是一种轻量级的Java平台,主要用于开发在小型电子设备上运行的应用程序,如早期的移动电话、PDA、智能...
【J2ME手机基于服务器的网络象棋游戏源代码】是一种专门为移动设备设计的网络棋类游戏实现,它利用Java 2 Micro Edition (J2ME) 技术,让玩家能够在手机上与其他在线用户对战。J2ME是Java平台的一个轻量级版本,主要...
发无线联网应用程序时,和以往有很大不同。 第八章“MIDP 2.0 安全体系结构” 将主要介绍MIDP 的安全体系模型,并结合一个具体的 实例来讲述MIDP2.0 安全模型的主要概念。 第九章“MIDP 2.0 Push 技术”介绍了如何...
j2me 是一种用于开发无线应用程序的平台,它提供了一个灵活、强大和开放的开发环境。随着 j2me 的普及,出现了许多开源框架,旨在简化开发过程,提高开发效率。下面将介绍这些框架,並分析它们的特点和功能。 1. ...
本章将深入探讨J2ME中的联网技术,特别是通用连接框架(Generic Connection Framework, GCF)。 ### 10.1 J2ME联网技术简介 在Java Standard Edition (J2SE)中,我们通常使用`java.net`和`java.io`包中的类来处理...
发无线联网应用程序时,和以往有很大不同。 第八章“MIDP 2.0 安全体系结构” 将主要介绍MIDP 的安全体系模型,并结合一个具体的 实例来讲述MIDP2.0 安全模型的主要概念。 第九章“MIDP 2.0 Push 技术”介绍了如何...
这要求我们在开发无线联网应用程序时,和以往有很大不同。 第八章“MIDP 2.0安全体系结构” 将主要介绍MIDP的安全体系模型,并结合一个具体的实例来讲述MIDP2.0安全模型的主要概念。 第九章“MIDP 2.0 Push ...
5. **网络编程**:J2ME支持通过无线网络进行数据传输,如HTTP和TCP/IP协议,这使得开发者可以构建能联网的应用,如游戏、天气预报应用等。 6. **文件系统**:在J2ME中,理解设备的本地存储和如何操作文件至关重要,...
蓝牙联网功能的实现则需要利用J2ME中的JSR-82(Java Bluetooth API),它提供了在设备之间建立无线连接的接口。开发者需要创建BluetoothServerSocket和BluetoothSocket来监听和建立连接,然后通过输入/输出流进行...
本书详细讲解了J2ME的图形用户界面、游戏线程、记录存储、通用联网架构等基础知识,还在以往MIDP1.0的基础上增补了2.0的新内容,并对这些新技术加以详细介绍,这些技术包括高级用户界面的新组件、GameAPI游戏开发...
7. **网络功能**:J2ME支持无线通信,可以实现在线多人游戏、排行榜同步或其他联网功能。 8. **优化技巧**:针对移动设备的内存限制和处理器性能,学习如何优化代码、减少资源消耗,提升游戏性能。 9. **错误处理...
J2ME MIDP广泛应用于移动游戏、企业级应用(如邮件客户端、天气预报应用)以及各种联网服务,如社交媒体、在线购物等。 6. **挑战与未来** 尽管J2ME提供了强大的功能,但它也面临着性能限制、安全问题和不同设备...
配置定义了基础的Java虚拟机(JVM)和核心库,而配置文件则添加了特定领域的功能,如无线通信、图形用户界面等。常见的配置文件有MIDP(Mobile Information Device Profile)和CLDC(Connected Limited Device ...
这要求我们在开发无线联网应用程序时,和以往有很大不同。 第八章“MIDP 2.0安全体系结构” 将主要介绍MIDP的安全体系模型,并结合一个具体的实例来讲述MIDP2.0安全模型的主要概念。 第九章“MIDP 2.0 Push ...