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

J2ME使用KSoap调用C#开发的Web Service

阅读更多

J2ME使用KSoap调用C#开发的Web Service(1)

 

1.概述

   对于J2ME访问远端的Web Service,除了官方标准JSR 172,我们还可以使用kSOAP。

kSOAPEnhydra.org的一个开源作品,EnhydraME项目的一部分。基于Enhydra.org出品的开源通用XML解析器kXMLkSOAP完成J2ME/MIDP平台上的SOAP解析和调用工作

Stefan Haustein领导的kSOAP开发小组于2001517推出了Alhpa版本。之后又经过了一年的开发,200266推出的kSOAP 1.2支持了SOAP1.2规范。2003825推出的kSOAP2,对SOAP序列化规范支持得更好了。

大多数人选择kSOAP的原因是,kSOAP虽然在20038月之后就不再维护了,但它是Open Source的,很容易加入增强特性,比如说默认情况下kSOAP2仅仅支持cmnet接入点,可以修改kSOAP2HttpTransport.java代码增加对cmwap接入点的支持。kSOAP2.0还有一个优点是,改进了对Microsoft dotNET的兼容。以前有很多人抱怨kSOAP调用dotNET编写的Web Service时遇到了不少的困扰。 

 

2.例子

    为了实现这一功能,今天和金金在网上搜了一整天,几乎把网络翻了一遍,见到的不是一样的东西,就是一些没解答的提问,简直是郁闷死了,中途我三次见了一下周公,呵呵,第三次醒来想起来要如何做了。先说一下我在网上收到的方法吧,把KSoap的Jar文件导入到工程中,然后再进行相应的操作,我照着做了,把jar文件导入到工程,在编译的时候是没有问题的,但在运行的时候去报错了,说java.lang.NoClassDefFoundError:org/xmlpull/v1/XmlPullParserException

可是我已经把类库Jar导入进去了啊,找了很长时间也无法解决,不知道网上的是怎么弄的,我用的是Eclipse+EclipseMe+Sun WTK。

     还好我找到了解决方案,我从网上找到了KSoap的源码,把它工程src中的文件加进了我的src中,然后编译运行都还成功,在网上下的KSoap源码不全,少几个java文件,我就用反编译工具把相应的.class文件弄成.java文件,这样就生成了比较犬的Ksoap源码,见附件。下面就先从创建Web Service讲起:

     我用的是VS2008,创建一个Web服务应用程序,代码如下:

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Xml.Linq;

namespace SimpleKSoapWS
{
    /// <summary>
    /// Service1 的摘要说明
    /// </summary>
    [WebService(Namespace = "urn:fengxing")]


    //创建时是自动生成的,把它注释掉
    //[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]  
    //[ToolboxItem(false)]

    // 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。
    // [System.Web.Script.Services.ScriptService]

    public class Service1 : System.Web.Services.WebService
    {

        [WebMethod] 

        [SoapRpcMethod(

            Action = "urn:fengxing/Hello",//.NET 要求将 HTTP SOAPAction 头用来标识所请求的操作;其格式是服务的名称空间后跟操作名,中间用 / 隔开(例如, urn:fengxing/foo)。
           
            RequestNamespace="",

            RequestElementName = "HelloRequest",

            ResponseNamespace="",

            ResponseElementName = "HelloResponse"

            )]
       public String  Hello(String username, String password) 
        {

            if (username != null)

                return ("Hello:" + username);

            else

                return "null";
        
        }


    }
}

    点击启动调试就可以运行。

      然后用Ksoap调用Web Service,创建一个J2ME Midlet Suite项目,添加名为Test的J2ME Midlet,再把Ksoap src文件夹下的文件添加到本项目src文件夹下,具体代码如下:

import java.io.IOException;

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

import org.ksoap2.*;
import org.ksoap2.serialization.*;
import org.ksoap2.transport.*;
import org.xmlpull.v1.XmlPullParserException;



public class Test extends MIDlet implements CommandListener{

	private Display dis;
	private Command connectCmd=new Command("连接",Command.OK,1);
	private Command exitCmd=new Command("退出",Command.EXIT,1);
	private Form f;
	private StringItem si=new StringItem("","");
	
	public Test() {
		// TODO Auto-generated constructor stub
	}

	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=Display.getDisplay(this);
		f=new Form("调用Web Service");
		f.append("要显示的内容:"+"\n");
		f.addCommand(connectCmd);
		f.addCommand(exitCmd);
		f.setCommandListener(this);
		dis.setCurrent(f);
	}

	public void commandAction(Command c, Displayable s) {
		// TODO Auto-generated method stub
		 if (c == exitCmd) 

	        { 
	            try {
	            	
					destroyApp(false);
					
					notifyDestroyed(); 
					
				} catch (MIDletStateChangeException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}           
	        } 
		 	if(c==connectCmd)
		 	{		 		
		 		//匿名内部Thread,调用ksoap2访问远程服务
		 		Thread webserviceThread=new Thread()
		 		{
		 			public void run()
		 			{
		 			 					
		 					String methodName="Hello";
		 					
		 					String serviceURL="http://localhost:4450/Service1.asmx";
		 					
		 					SoapObject request=new SoapObject(null,methodName);
		 					
		 					request.addProperty("username", "xiaowen");
		 					
		 					request.addProperty("password", "pwd");
		 					
		 					SoapSerializationEnvelope envelope=new SoapSerializationEnvelope(SoapEnvelope.VER11);
		 					
		 					envelope.bodyOut=request;
		 					
		 					HttpTransport ht=new HttpTransport(serviceURL);
		 					
		 					ht.debug=true;	 						 					
		 					
		 					String Response = null;
		 					
		 					try {
		 						
								ht.call("urn:fengxing/Hello", envelope);//和.NET中SoapRpcMethod的Action一样
								
								Response = envelope.getResponse().toString();
								
		 					}catch (ConnectionNotFoundException e) {

		 						System.out.println("先打开服务器");
								
								return;
								
							} catch (IOException e) {
								
								e.printStackTrace();
								
							} catch (XmlPullParserException e) {
								
								e.printStackTrace();														
								
							}
		 				
		 					System.out.println("dump>>" + ht.responseDump);		 					
		 					
		 					si.setText(Response);
							
							f.append(si);
							
							f.removeCommand(connectCmd);
																 				
		 			}
		 		};
		 		
		 		webserviceThread.start();
		 		
		 	}

	}

}

   要保证创建的服务是打开的,最终运行结果如下:



 

3.详解

     明天吧。

  • 大小: 40.5 KB
分享到:
评论
5 楼 xwz0528 2010-08-02  
4楼的问题我也遇到过,webservice.webxml.com.cn提供的服务可能不支持J2ME。SoapRpcMethod用于指定客户端调用Web Services所使用的通信协议,本文使SoapRpc方式是为了能和Java所写的客户端进行通信,也是Web Services所使用的标准通信协议,如果不是SoapRpc方式,在J2ME中就不能成功调用。至于webservice.webxml.com.cn使用的什么方式我就不知道了。
4 楼 heshan664754022 2010-07-29  
请教一个问题
import java.io.IOException;  
 
import javax.microedition.midlet.*;  
import javax.microedition.io.ConnectionNotFoundException;  
import javax.microedition.lcdui.*;  
 
import org.ksoap2.*;  
import org.ksoap2.serialization.*;  
import org.ksoap2.transport.*;  
import org.xmlpull.v1.XmlPullParserException;  
 
 
 
public class test5 extends MIDlet implements CommandListener{  
 
    private Display dis;  
    private Command connectCmd=new Command("l锟斤拷",Command.OK,1);  
    private Command exitCmd=new Command("锟剿筹拷",Command.EXIT,1);  
    private Form f;  
    private StringItem si=new StringItem("","");  
      
    public test5() {  
        // TODO Auto-generated constructor stub  
    }  
 
    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=Display.getDisplay(this);  
        f=new Form("锟斤拷锟斤拷Web Service");  
        f.append("要锟斤拷示锟斤拷锟斤拷锟捷o拷"+"\n");  
        f.addCommand(connectCmd);  
        f.addCommand(exitCmd);  
        f.setCommandListener(this);  
        dis.setCurrent(f);  
    }  
 
    public void commandAction(Command c, Displayable s) {  
        // TODO Auto-generated method stub  
         if (c == exitCmd)   
 
            {   
                try {  
                      
                    destroyApp(false);  
                      
                    notifyDestroyed();   
                      
                } catch (MIDletStateChangeException e) {  
                    // TODO Auto-generated catch block  
                    e.printStackTrace();  
                }             
            }   
            if(c==connectCmd)  
            {                 
                //锟斤拷锟斤拷锟节诧拷Thread锟斤拷锟斤拷锟斤拷ksoap2锟斤拷锟斤拷远锟教凤拷锟斤拷  
                Thread webserviceThread=new Thread()  
                {  
                    public void run()  
                    {  
                                          
                            String methodName="getMobileCodeInfo";  
                               String as="15053189130";
                         
                            String serviceURL="http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx";  
                              
                            SoapObject request=new SoapObject(serviceURL,methodName);  
                            request.addProperty("mobileCode", as);  
                        
                            request.addProperty("userID","");  
                              
                            SoapSerializationEnvelope envelope=new SoapSerializationEnvelope(SoapEnvelope.VER11);  
                              
                            envelope.bodyOut=request;  
                            //(new MarshalBase64()).register(envelope);  
                            HttpTransport ht=new HttpTransport(serviceURL);  
                              
                            ht.debug=true;                                                
                              
                            String Response = null;  
                              
                            try {  
                                  
                                ht.call("http://WebXml.com.cn/getMobileCodeInfo", envelope);//锟斤拷.NET锟斤拷SoapRpcMethod锟斤拷Action一锟斤拷
                               // ht.call(null, envelope);
                                  
                                Response = envelope.getResponse().toString();  
                                  
                            }catch (ConnectionNotFoundException e) {  
 
                                System.out.println("锟饺打开凤拷锟斤拷锟斤拷");  
                                  
                                return;  
                                  
                            } catch (IOException e) {  
                                  
                                e.printStackTrace();  
                                  
                            } catch (XmlPullParserException e) {  
                                  
                                e.printStackTrace();                                                          
                                  
                            }  
                          
                            System.out.println("dump>>" + ht.responseDump);                             
                            System.out.println(Response);
                            si.setText(Response);  
                              
                            f.append(si);  
                              
                            f.removeCommand(connectCmd);  
                                                                                  
                    }  
                };  
                  
                webserviceThread.start();  
                  
            }  
 
    }  
 

我仿照你的去调用一个现有的web服务,为什么不行呢,我在j2se项目里可以调用这个服务,但是在j2me里面,调用后 总是返回说手机号码错误,请帮忙下
3 楼 heshan664754022 2010-07-26  
弄出来了,以前学习都是用java开发的,走的是8080端口,没想到.net的不一样,现在找到原因啦,呵呵,谢了。
2 楼 xwz0528 2010-07-26  
你不是用VS创建的Web Service吗,Web Service是一项服务,需要一直运行,你的异常“没有打开服务器”,是没有运行服务端,VS中直接进行调试就可以运行,然后才能提供服务,供客户端调用。 最近我正在做这类软件
1 楼 heshan664754022 2010-07-25  
我想问下系统自动生成的这个http://tempuri.org/
和你命名的urn:fengxing有什么区别,还有为什么我运行的时候会报异常,说先打开服务器,要打开那个服务器呢?

相关推荐

    J2me连接WebServices框架 - kSOAP2源码

    9. **示例应用**:压缩包中的源码可能是作者开发的一个示例应用,展示了如何使用 kSOAP2 调用 Web Services。通过分析这些代码,初学者可以快速入门,了解实际开发流程。 总的来说,这个资源对于想要在 J2ME 平台上...

    J2ME开发 J2ME开发 J2ME开发

    在J2ME开发中,开发者通常会使用集成开发环境(IDE),如NetBeans、Eclipse或JBuilder,这些工具提供了代码编辑、调试和打包应用的功能。编写完代码后,需要通过模拟器或实际设备进行测试。 "J2ME开发.pdf"可能包含...

    J2me 如何连接 web service 教程

    Java 2 Micro Edition (J2ME) 是一种用于开发...总的来说,J2ME 连接 Web Service 主要涉及到 SOAP 协议的理解、kSOAP2 库的使用以及 J2ME 的网络编程。掌握这些知识,你就能创建出能够利用远程服务功能的 J2ME 应用。

    J2me访问c# Web Services

    在本文中,我们将深入探讨如何让J2ME应用程序访问由C#编写的Web服务,同时解决中文字符传输的问题。J2ME(Java 2 Micro Edition)是一种轻量级的Java平台,广泛应用于移动设备和嵌入式系统。C#则是微软开发的一种...

    J2me访问c# Web Services解决了中文乱码

    在本文中,我们将探讨如何使用J2ME(Java 2 Micro Edition)访问由C#编写的Web服务,并解决在传输过程中可能出现的中文乱码问题。首先,我们需要了解J2ME和.NET平台之间的编码差异。 J2ME是Java平台的一个轻量级...

    web service\kSOAP的运用

    一个基本的Web服务调用示例如下,展示如何使用kSOAP传递String类型的数据: 首先,在服务器端创建一个简单的Web服务,如Java的Servlet或ASP.NET Web服务。以下是一个简单的Java示例: ```java public class ...

    axis+ksoap2开发webservice配置指南

    总的来说,"axis+ksoap2开发webservice配置指南"是一个关于在Java环境下使用Axis创建Web服务,并使用ksoap2在J2ME平台上进行调用的实践教程。这个过程涉及到了Web服务的生命周期管理、SOAP通信机制以及J2ME平台上的...

    解析用于J2ME开发平台的Web服务API 解析用于J2ME开发平台的Web服务API

    **解析用于J2ME开发平台的Web服务API详解** Java 2 平台袖珍版 (J2ME) 是一种轻量级的Java版本,专为资源受限的移动设备和嵌入式系统设计。为了在这些设备上实现Web服务功能,Java Community Process (JCP) 定义了...

    j2me游戏开发 经典教程

    j2me游戏开发j2me游戏开发j2me游戏开发j2me游戏开发j2me游戏开发j2me游戏开发j2me游戏开发

    J2ME无线通信技术应用开发

    J2ME无线通信技术应用开发,手机编程.主要介绍了基于java的手机软件开发。

    ksoap2源代码及jar包

    总的来说,kSOAP2-j2ME是J2ME开发中与Web服务交互的重要工具。理解和掌握kSOAP2的使用方法和原理,对于提升J2ME应用的功能性和可扩展性有着重要作用。通过深入研究源代码,开发者可以更好地定制和优化其在特定项目中...

    j2me 开发工具的使用

    **J2ME开发工具的使用** Java 2 Micro Edition(J2ME)是Java平台的一个子集,专门用于嵌入式设备和移动设备的开发,如手机、智能家电等。在J2ME开发中,选择合适的开发工具至关重要,因为它们能够帮助开发者高效地...

    J2me 基础学习 rpg游戏开发学习

    对于想要学习如何使用 J2ME 开发 RPG 游戏的初学者来说,以下是一些关键知识点: 1. **J2ME 架构**:理解 J2ME 的架构至关重要,它包括配置(Configurations)和Profile(Profiles)。配置定义了运行环境的基本硬件...

    基于Web Service的3G手机应用开发常见问题汇总.doc

    【基于Web Service的3G手机应用开发常见问题】 在基于Web Service的3G手机应用开发过程中,开发者常常遇到一系列技术和概念性的问题。Web Service是一种基于开放标准(如XML、SOAP和WSDL)的通信协议,它允许不同...

    J2ME使用教程,手机游戏开发

    J2ME(Java 2 Micro Edition)是Java技术的一个重要组成部分,它主要针对的是嵌入式设备和消费类电子产品的应用开发,比如早期的智能手机、移动电话、PDA、数字电视等。J2ME由Sun Microsystems(后被Oracle收购)...

    Android平台调用为本service详解

    在Android平台上调用Web Service,通常需要借助第三方库来实现,这里主要介绍的是使用ksoap2-android库。ksoap2是一个轻量级的SOAP客户端开发包,尤其适用于资源有限的Java环境,比如Applets或者J2ME应用程序。而在...

    j2ME游戏开发详解

    开发者通常使用Sun Microsystems的KJava模拟器或NetBeans IDE进行j2ME应用开发。这些工具提供了代码编辑、调试和设备模拟等功能,帮助开发者在无实际设备的情况下测试应用。 三、MIDP API MIDP API是j2ME游戏开发...

Global site tag (gtag.js) - Google Analytics