WebService
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WebService相关的知识,希望对你有一定的参考价值。
1 便民查询网站的分析
1.1 为了方便广大网民的日常查询需求,通过便民查询网站可以查询手机号、IP地址、天气等信息,如下图所示:
- 通常我们写的Javaweb应用从数据库查询数据,如下图所示。
- 实时天气信息在我们的系统数据库是不存在的,这时就需要通过一种接口技术调用存有天气数据的系统,通过这个接口将天气信息实时获取过来再便民查询网站显示。但是对方系统的环境我们是不知道的,这种接口及时必须是可以跨平台访问的。
1.2 客户端/服务器通信
- TCP是一种面向连接的协议,提供可靠的数据传输,一般服务质量要求比较高的情况下,使用这个协议。TCP支持的应用协议主要有:Telnet、FTP、SMTP等。
- UDP是用户数据包协议,是一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。UDP支持的应用层协议主要有:NFS(网络文件系统)、DNS(域名系统)等。
1.3 Socket实现
- 服务端创建ServletSocket,启动服务、监听端口。
- 客户端创建Socket,连接服务端。
- 客户端通过OutputStream发送数据到服务端。
- 服务端通过InputStream接收客户端发送的数据。
- 服务端处理完毕通过OutputStream发送数据到客户端。
- 客户端通过InputStream接收服务端发送的数据。
- Socket服务端--定义查询天气服务端的Runner
package cn.server; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; /** * 描述: */ public class WeatherThread implements Runnable { private Socket socket; public WeatherThread(Socket socket){ this.socket = socket; } @Override public void run() { InputStream is = null; OutputStream os = null; try { //读取数据 is = socket.getInputStream(); byte[] buffer = new byte[1024]; int len = 0; while((len = is.read(buffer)) != -1){ System.out.print("客户端发送来的数据:"+new String(buffer,0,len)); } //线程睡眠 Thread.sleep(1000); //返回数据 String result = "晴天"; os.write(result.getBytes("utf-8")); } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } finally { } } }
- 天气查询服务端主类
package cn.server; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; /** * 描述: */ public class WeatherServer { public static void main(String[] args) throws IOException { ServerSocket socket = new ServerSocket(12345); System.out.print("服务器端已经启动"); while(true){ //监听客户端连接 Socket accept = socket.accept(); new Thread(new WeatherThread(accept)).start(); } } }
- 客户端
package cn.client; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; /** * 描述: */ public class WeatherClient { public static void main(String[] args) throws IOException { Socket socket = null; InputStream is = null; OutputStream os = null; try{ socket = new Socket("127.0.0.1",12345); os = socket.getOutputStream(); os.write("江苏".getBytes("utf-8")); is = socket.getInputStream(); byte[] buffer = new byte[1024]; int len = 0; while((len = is.read(buffer))!= -1){ System.out.print("服务器传送的数据"+new String(buffer,0,len)); } }finally { socket.close(); is.close(); os.close(); } } }
1.4 WebService实现
- Java中共有三种WebService规范,分别是JAX-WS、JAXM&SAAJ、JAX-RS。
- JAX-WS介绍
- JAX-WS的全称是Java API for XML-bases Webservices。早起的基于SOAP的Java的web服务器规范JAX-RPC目前已经被JAX-WS规范取代。从Java5开始支持JAX-WS2.0版本,JDK1.6.0_13以后的版本支持2.1版本,JDK1.7支持2.2版本。
- JAXM&SAAJ
- JAXM主要定义了包含定义了发送和接收信息所需要的API,SAAJ是和JAXM搭配使用的API,为构建SOAP包和解析SOAP包提供了重要的支持,支持附件传输等,JAXM&SAAJ和JAX-WS都是基于SOAP的web服务,相比之下JAXM-SAAJ暴露了SOAP更多的底层细节,编码比较麻烦,而JAX-WS更加抽象,隐藏了更多的细节,更多的面向对象,实现起来基本不需要关心SOAP的任何细节。
- JAX-RS
- JAX-RS是Java针对REST风格指定的一套web服务规范,由于推出的较晚并没有和JDK1.6一起发布。
1.4.1 JAX-WS示例
- 1 服务端开发
- 编写SEI(Service Endpoint interface)。SEI在webService中称为portType,在Java中称为接口。
package cn.server; /** * 描述:天气查询服务接口 */ public interface WeatherInterface { public String queryWeather(String cityName); }
-
- 编写SEI实现类,此类作为WebService提供服务类。
package cn.server; import javax.jws.WebService; /** * 描述:天气查询SEI的实现类 */ //使用@WebService标识此类是webservice的服务类 @WebService public class WeatherInterfaceImpl implements WeatherInterface { @Override public String queryWeather(String cityName) { System.out.println("从客户端:"+cityName); String result = "晴朗"; System.out.println("到客户端:"+result); return null; } }
-
- 发布服务
package cn.server; import javax.xml.ws.Endpoint; /** * 描述:发布天气查询服务 */ public class WeatherServerWebService { public static void main(String[] args){ Endpoint.publish("http://127.0.0.1:12345/weather",new WeatherInterfaceImpl()); } }
- 2 查看WSDL
- webservice发布成功后,通过WSDL查看WebService发布的正确性。
- 1 在地址栏输入
http://127.0.0.1:12345/weather?wsdl
-
- 2 WSDL不是WebService,只是获取一个用于描述WebService的说明文件。
- 3 WSDL是以XML文件形式来描述WebService的说明书。
- 3 Wsimport 生成客户端调用类
以上是关于WebService的主要内容,如果未能解决你的问题,请参考以下文章
C#动态调用webService出现 基础连接已经关闭: 未能为 SSL/TLS 安全通道建立信任关系。
当我们在webservice.asmx.cs中编写所有代码时,webservice.asmx有啥用?