引用:http://www.cnblogs.com/zhangdongzi/archive/2011/04/19/2020688.html

上一节中我们通过http协议,采用HttpClient向服务器端action请求数据。当然调用服务器端方法获取数据并不止这一种。WebService也可以为我们提供所需数据,

那么什么是webService呢?,它是一种基于SAOP协议的远程调用标准,通过webservice可以将不同操作系统平台,不同语言,不同技术整合到一起。

我们在PC机器java客户端中,需要一些库,比如XFire,Axis2,CXF等等来支持访问WebService,但是这些库并不适合我们资源有限的android手机客户端,做过JAVA ME的人都知道有KSOAP这个第三方的类库,可以帮助我们获取服务器端webService调用,当然KSOAP已经提供了基于android版本的jar包了,那么我们就开始吧:

首先下载KSOAP包:ksoap2-android-assembly-2.5.2-jar-with-dependencies.jar包

然后新建android项目:并把下载的KSOAP包放在android项目的lib目录下:右键->build path->configure build path--选择Libraries,如图:

以下分为七个步骤来调用WebService方法:

第一:实例化SoapObject 对象,指定webService的命名空间(从相关WSDL文档中可以查看命名空间),以及调用方法名称。如:

View Code

//命名空间
privatestaticfinalString serviceNameSpace="http://WebXml.com.cn/";
//调用方法(获得支持的城市)
privatestaticfinalString getSupportCity="getSupportCity";

//实例化SoapObject对象
SoapObject request=newSoapObject(serviceNameSpace, getSupportCity);

第二步:假设方法有参数的话,设置调用方法参数

request.addProperty("参数名称","参数值");

第三步:设置SOAP请求信息(参数部分为SOAP协议版本号,与你要调用的webService中版本号一致):

View Code

//获得序列化的Envelope
SoapSerializationEnvelope envelope=newSoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.bodyOut=request;

第四步:注册Envelope,

(new MarshalBase64()).register(envelope);

第五步:构建传输对象,并指明WSDL文档URL:

View Code

//请求URL
privatestaticfinalString serviceURL="http://www.webxml.com.cn/webservices/weatherwebservice.asmx";
//Android传输对象
AndroidHttpTransport transport=newAndroidHttpTransport(serviceURL);
transport.debug=true;

第六步:调用WebService(其中参数为1:命名空间+方法名称,2:Envelope对象):

View Code

第七步:解析返回数据:

View Code

这样就成功啦。那么现在我们就来测试下吧,这里有个地址提供webService天气预报的服务的,我这里只提供获取城市列表:

View Code

然后你可以在浏览器中输入地址(WSDL):serviceURL,你会看到一些可供调用的方法:

我们选择获取国内外主要城市或者省份的方法吧:getSupportProvice,然后调用,你会发现浏览器返回给我们的是xml文档:

View Code

我们可以用 listview来显示:

那么下面我将给出全部代码:

View Code

以及帮助类:

View Code

publicclassWebServiceUtil {

//命名空间
privatestaticfinalString serviceNameSpace="http://WebXml.com.cn/";
//请求URL
privatestaticfinalString serviceURL="http://www.webxml.com.cn/webservices/weatherwebservice.asmx";
//调用方法(获得支持的城市)
privatestaticfinalString getSupportCity="getSupportCity";
//调用城市的方法(需要带参数)
privatestaticfinalString getWeatherbyCityName="getWeatherbyCityName";
//调用省或者直辖市的方法(获得支持的省份或直辖市)
privatestaticfinalString getSupportProvince="getSupportProvince";

/*************
* @return城市列表
*************/
publicstaticList<String>getCityList(){
//实例化SoapObject对象
SoapObject request=newSoapObject(serviceNameSpace, getSupportCity);
//获得序列化的Envelope
SoapSerializationEnvelope envelope=newSoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.bodyOut=request;
(newMarshalBase64()).register(envelope);
//Android传输对象
AndroidHttpTransport transport=newAndroidHttpTransport(serviceURL);
transport.debug=true;

//调用
try{
transport.call(serviceNameSpace+getWeatherbyCityName, envelope);
if(envelope.getResponse()!=null){
returnparse(envelope.bodyIn.toString());
}

} catch(IOException e) {
//TODO Auto-generated catch block
e.printStackTrace();
} catch(XmlPullParserException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}

returnnull;
}

publicstaticList<String>getProviceList(){
//实例化SoapObject对象
SoapObject request=newSoapObject(serviceNameSpace, getSupportProvince);
//获得序列化的Envelope
SoapSerializationEnvelope envelope=newSoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.bodyOut=request;
(newMarshalBase64()).register(envelope);
//Android传输对象
AndroidHttpTransport transport=newAndroidHttpTransport(serviceURL);
transport.debug=true;

//调用
try{
transport.call(serviceNameSpace+getWeatherbyCityName, envelope);
if(envelope.getResponse()!=null){
returnnull;
}

} catch(IOException e) {
//TODO Auto-generated catch block
e.printStackTrace();
} catch(XmlPullParserException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}

returnnull;
}

/*************
* @paramcityName
* @return
*************/
publicstaticString getWeather(String cityName){

return"";
}

/**************
* 解析XML
* @paramstr
* @return
*/
privatestaticList<String>parse(String str){
String temp;
List<String>list=newArrayList<String>();
if(str!=null&&str.length()>0){
intstart=str.indexOf("string");
intend=str.lastIndexOf(";");
temp=str.substring(start, end-3);
String []test=temp.split(";");

for(inti=0;i<test.length;i++){
if(i==0){
temp=test[i].substring(7);
}else{
temp=test[i].substring(8);
}
intindex=temp.indexOf(",");
list.add(temp.substring(0, index));
}
}
returnlist;
}

/*********
* 获取天气
* @paramsoapObject
*/
privatevoidparseWeather(SoapObject soapObject){
//String date=soapObject.getProperty(6);
}
}

以上就是我所作的查询天气预报的全部核心代码了,读者可以根据注释以及本文章了解下具体实现,相信很快就搞明白了,运行结果如下:

到此结束,下一节主要是socket通信了。

客户端,服务器,天气预报相关推荐

  1. 客户端修改文件服务器密码,客户端服务器登录 密码问题

    客户端服务器登录 密码问题 内容精选 换一换 介绍使用同一VPC内弹性云服务器ECS上的Telnet客户端连接Memcached实例的方法.已成功申请Memcached实例,且状态为"运行中 ...

  2. 使用TDI与WinSock进行客户端服务器编程

    简介: 在本文中,您将了解到使用传输驱动程序接口TDI与应用层套接字WinSock客户端服务器应用程序内核级编程实现细节.介绍常用的TDI函数并提供编写TDI与WinSock(TCP)应用程序的详细说 ...

  3. python16进制字节序_第 1 章 套接字、IPv4和简单的客户端/服务器编程

    第 1 章 套接字.IPv4和简单的客户端/服务器编程 本章攻略: 打印设备名和IPv4地址 获取远程设备的IP地址 将IPv4地址转换成不同的格式 通过指定的端口和协议找到服务名 主机字节序和网络字 ...

  4. c 服务器文件是存在,客户端服务器在较大的文件的c文件传输问题

    下面的代码适用于最后一个数据包包含的数据少于最大长度的较小文件,该功能通过显示接收到的文件正确退出. 如果传输的文件的最后一个数据包或缓冲区包含与我的情况下接收缓冲区阵列512的大小相同的确切数量.然 ...

  5. 【python网络编程】创建TCP/UDP服务器进行客户端/服务器间通信

    客户端/服务器网络编程介绍 套接字:通信端点 实例:客户端发送数据,接收服务器返回的时间戳 用Python 编写FTP 客户端程序 客户端/服务器网络编程介绍 软件服务器也运行在一块硬件之上,但是没有 ...

  6. java tcp发消息给硬件_java – TCP客户端/服务器通信只发送第一条消息?

    我在java中设置一个简单的TCP客户端服务器交互. 服务器: 服务器是用Java编写的桌面客户端: import java.io.BufferedReader; import java.io.Dat ...

  7. cov/cor中有遗漏值_协调遗漏的效果–使用简单的NIO客户端/服务器测量回送延迟...

    cov/cor中有遗漏值 在这篇文章中,我演示了许多想法和技术: 如何编写一个简单的非阻塞NIO客户端/服务器 协同遗漏的影响 如何测量百分位数的延迟(相对于简单平均) 如何在计算机上计时延迟回送 我 ...

  8. jmx jolokia_使用Jolokia和JMX进行客户端服务器监视

    jmx jolokia Java监视工具的选择非常广泛(由Google提供的随机选择和顺序): javamelody 压力探头 JVisualVM 控制台 贾蒙 Java JMX Nagios插件不适 ...

  9. 协同遗漏的效果–使用简单的NIO客户端/服务器测量回送延迟

    在这篇文章中,我演示了许多想法和技术: 如何编写一个简单的非阻塞NIO客户端/服务器 协调遗漏的影响 如何测量百分位数的延迟(相对于简单平均) 如何在计算机上计时延迟回送 我最近正在为客户端服务器应用 ...

  10. 使用Jolokia和JMX进行客户端服务器监视

    Java监视工具的选择非常广泛(由Google提供的随机选择和顺序): javamelody 压力探头 JVisualVM 控制台 贾蒙 Java JMX Nagios插件不适用 此外,还有各种专用工 ...

最新文章

  1. socket编程:多路复用I/O服务端客户端之poll
  2. MySQL修改数据表(ALTER TABLE语句)
  3. 标题在图表上_从零开始学Excel——标题和图例的设置(143)
  4. 有趣的反直觉的“三门问题”
  5. matlab 数值解 期权顶级啊,潮盈期权院高胜率交易技巧系列之二----期权交易策略及基于MATLAB统计套利介绍...
  6. SQL SERVER CHAR ( integer_expression )各版本返回值差异的案例
  7. WCF技术剖析之二十八:自己动手获取元数据[附源代码下载]
  8. vs2017安装QT开发插件
  9. 如何免费将PDF文档压缩到最小?
  10. 英特尔发布第三代全新可扩展处理器,加速5G网络转型
  11. 学计算机的高数学什么,儿子大一,学的计算机科学与技术,感觉高数特别难,都学不会怎么办呢?有什么好办法?...
  12. c语言打印红色爱心(程序员的浪漫)
  13. n个数字生成排列组合对象的算法(Johnson-Trotter)
  14. 【CV】ViT:用于大规模图像识别的 Transformer
  15. FastReport快速实现条形码,二维码面单打印
  16. 从菜鸟到大师——Python量化之路
  17. MUSIC算法原理及MATLAB代码 阵列信号处理
  18. window7 + Excel 2013 安装 SQL Server 2012
  19. matlab wc wp,MATLAB_IIR_带通通滤波
  20. input输入框的限制输入

热门文章

  1. 反引号注入_什么是 SQL 注入?
  2. 汇编语言典型例子详解_从架构到 RTOS 详解 DSP 和 MCU 的区别和联系
  3. 深入浅出Javascript闭包
  4. 2020-12-09 深度学习 卷积核/过滤器、特征图(featue map)、卷积层
  5. linux tomcat 清空war,Linux下tomcat部署war包
  6. 实用VUE 开发插件!!前端必备
  7. Python-OpenCV 杂项(二): 鼠标事件
  8. 《漫画算法2》源码整理-8 链表中倒数第K个节点元素
  9. 最简便的备份MySql数据库方法
  10. OpenCV学习笔记(十一)(十二)(十三)(十四)(十五)