WAPBinaryXML                                                            定义好            XML片断                                    表述出同步服务器地址、远程数据库名称、登录账号等等内容            一、两种访问方法:    目前的kxml支持两种wap格式:WBXML/WML。    而有两种方法将解析WBXML:    1。使用j2me将WBXML转换到XML;    2。使用kxml直接解析WBXML流。下面我在这里讨论一下使用第二种方法实现client代码解析WBXML,当然要使用kxml了。    二、kxml实现方法:    首先需要位于webserver的应用程序通过开放WAP网关(关于JWAP:详见http://jwap.sourceforge.net/)发送WML文件给j2meclient。在WAP网关将数据发送j2meclient之前WAP网关将WML文件转换为了WBXML文件。下面代码的展示了j2meclient如何接收WBXML数据,解析数据,并显示有用的数据在手机屏幕上。    需要注意,在本例程中使用的kxmlv1.0版本,kxmlv2.0版本在使用上可能有所不同,开发者可以参考kxml2的手册。    importjava.io.*;  importorg.kxml.*;  importorg.kxml.parser.*;  importorg.kxml.wap.*;  importjavax.microedition.lcdui.*;  importjavax.microedition.midlet.*;  importjavax.microedition.io.*;  publicclassWbxmlTestextendsMIDletimplementsCommandListener  { privateDisplaydisplay=null; privateListmenu=null;  privateFormform=null;  privateStringincomingText="";  staticfinalCommandokCommand  =newCommand("Ok",  Command.OK,  1);  staticfinalCommandexitCommand  =newCommand("Exit",  Command.EXIT,  0);  //ThisisahardcodedWSPmessagethatcontains  //addressofwebserverwhere ourjsppageislocated.  byte[]message={  (byte)'1',(byte)0x40,(byte)0x3D,(byte)'h',(byte)'t',  (byte)'t',(byte)'p',(byte)':',(byte)'/',(byte)'/',  (byte)'l',(byte)'o',(byte)'c',(byte)'a',(byte)'l',  (byte)'h',(byte)'o',(byte)'s',(byte)'t',(byte)':',  (byte)'8',(byte)'0',(byte)'8',(byte)'0',(byte)'/',  (byte)'e',(byte)'x',(byte)'a',(byte)'m',(byte)'p',  (byte)'l',(byte)'e',(byte)'s',(byte)'/',(byte)'j',  (byte)'s',(byte)'p',(byte)'/',(byte)'f',(byte)'i',  (byte)'n',(byte)'a',(byte)'l',(byte)'f',(byte)'i',  (byte)'l',(byte)'e',(byte)'s',(byte)'/',(byte)'D',  (byte)'a',(byte)'t',(byte)'.',(byte)'j',(byte)'s',  (byte)'p',(byte)0x80,(byte)0x94,(byte)0x88,(byte)0x81,  (byte)0x6A,(byte)0x04,(byte)0x83,(byte)0x99  };  //Memoryspacetoreceivemessage. byte[]msg=newbyte[256];  publicvoidpauseApp(){/*-----*/}  publicvoiddestroyApp(booleanunconditional)  {notifyDestroyed();}  publicvoidstartApp(){  display=Display.getDisplay(this);  this.mainMenu();  }//startApp  //Displaysthemenuscreen  privatevoidmainMenu(){  menu=newList("SendRequest",Choice.IMPLICIT);  menu.append("SendMessage",null);  menu.addCommand(okCommand);  menu.setCommandListener(this);  display.setCurrent(menu);  }//mainMenu  //DisplaythereplyfromWAPGateway(JWap).  privatevoidshowReply() {  form=newForm("IncomingMessage");  form.append("Theprice="+incomingText);    form.addCommand(exitCommand);  form.setCommandListener(this);  display.setCurrent(form); }//showReply  //MakesaWSPConnectionwithaWAPGateway,  //Sendsamessageandreceivesthereply.  publicvoidgetConnect(){  Datagramdgram=null;  DatagramConnectiondc=null;  try  {  dc=(DatagramConnection)Connector.open("datagram://127.0.0.1:9200");  dgram=dc.newDatagram(message,message.length);  try{  dc.send(dgram);}  catch(InterruptedIOExceptione){  e.printStackTrace();}  dgram=dc.newDatagram(msg,msg.length);  try{  dc.receive(dgram);}  catch(InterruptedIOExceptione){  e.printStackTrace();}  catch(IOExceptione){  e.printStackTrace();}  //Thisisthemostinterestingpart.  incomingText=this.getIncomingTextOfWmlc(dgram.getData());  this.showReply();  dc.close();  }//try  catch(IllegalArgumentExceptionie){  ie.printStackTrace();}  catch(ConnectionNotFoundExceptioncnf){  cnf.printStackTrace(); }  catch(IOExceptione){e.printStackTrace();}  }//getConnect()  privateStringgetIncomingTextOfWmlc(byte[]wmlc){  try{  //RemoveWSPheader.  //Weknowitis19bytesforourcase.  //Butforrealworldapplications,  //thisshouldbedynamicallydeteced.  for(intj=0;j<wmlc.length-19;j++)  wmlc[j]=wmlc[j+19];  WmlParserparser=newWmlParser(newByteArrayInputStream(wmlc));  while(true){  try{  ParseEventparseEvent=parser.read();  if(parseEvent.getType()==Xml.START_TAG){  Attributeattr=  parseEvent.getAttribute("value");  if(attr!=null)  returnattr.getValue();  }//if  }//try  catch(IOExceptione){}  }//while  }//try  catch(IOExceptione){e.printStackTrace(); }  return"error";  }//getIncomingTextOfWmlc  publicvoidcommandAction(Commandc,Displayabled){  Stringcommandlabel=c.getLabel();  if(commandlabel.equals("Exit"))  destroyApp(false);  elseif(commandlabel.equals("Ok"))  getConnect();  }//commandAction  }//classWbxmlTest    为了演示目的,除了建立一个webServer外,还要在本机建立一个JWAPServer。    三、代码说明:    上面的代码将数据连接请求发送到了本机的JWAPServer的URL:“datagram://127.0.0.1:9200”,并发送了一个硬编码的WSP(wirelessSessionProtocol)请求:http://localhost:8080/examples/jsp/finalfiles/Dat.jsp,然后等待并读取JWAPServer的回应,在接收到回应信息后使用kxml解析提取其中的数据(元素属性名为“value”的属性值)。在解析完成后,将数据显示于手机屏幕上。    代码中的getConnect方法建立与JWAPServer的连接,并发送请求给JWAPServer,要求访问webServer上的http://localhost:8080/examples/jsp/finalfiles/Dat.jsp,在接收到JWAPServer发回的请求后,getConnect方法调用getIncomingTextOfWmlc方法提取接收到的WBXML数据。由于j2meclient与JWAPServer之间的通讯使用了WAP协议堆栈,所以j2meclient接收的数据中包含WSP头,在getIncomingTextOfWmlc方法中首先去掉了这个WSP头。    之后,getIncomingTextOfWmlc方法使用KXML的事件解析机制进行了4步操作:    1。传入保存WBXML数据的字节数组构造WmlParser对象;    2。调用WmlParser的read方法,找到第一个TAG开始的地方;    3。读取“value”属性值;    4。回到第2步进行2、3之间的循环,直到找不到START_TAG。    四、数据流程:    而在JWAP网关接收到j2meclient发来的硬编码请求后,将这个请求转发给了webServer,本例程中的webServer为http://localhost:8080。webServer接收到请求后,使用一个硬编码的WML文件作为回应:  <?xmlversion="1.0"?>  <!DOCTYPEwmlPUBLIC"-//WAPFORUM//DTDWML1.1//EN""http://www.wapforum.org/DTD/wml_1.1.xml">  <%@pagelanguage="java"contentType="text/vnd.wap.wml"%>  <wml>  <cardid="c0"newcontext="false"ordered="false">  <inputtype="Price"value="15224"emptyok="false"/>  </card>  </wml>    当JWAP网关接收到这个webServer的WML文件后,将其转换为WBXML格式并修改其content-type编码为WBXML,最后将转换后的WBXML格式数据发给了j2meclient。    五、总结:    使用kxml方法避免了XML与WBXML之间的相互转换,WBXML文件的格式减少了XML文件的大小,不仅可将WBXML用于WAP设备,也可以用于基于web的程序与无线设备之间的通讯和数据交换。        

更多相关文章

  1. Android退出当前应用程序的方法
  2. Android开发--NDK之环境搭建
  3. Android(安卓)界面类 Activity 和 Fragment 互相传递返回值解析
  4. android view 的移动的几种方式
  5. Android(安卓)studio断点调试(全在这里)
  6. Android(安卓)SQLite使用详解和多线程并发访问
  7. Android(安卓)View事件分发、拦截、消费机制
  8. Android开发 - 获取Android设备的唯一标识码(Android(安卓)6.0或
  9. 【转载】Andoid Studio-android开发02-第一个程序-调试-运行方法

随机推荐

  1. android粗略获得程序运行时间的方法
  2. Android版本与Linux内核的关系
  3. 让Activity变成一个窗口
  4. Android消息机制Message消息池
  5. Android学习资源
  6. Android(安卓)源码分析 —— 从 Toast 出
  7. Android自动打包、签名、优化、上传ANT脚
  8. traceview进行Android性能测试
  9. Android
  10. android ddms查看线程