文章来源:黑马程序员_webservice
1 基础概念
Web
web的本意是蜘蛛网和网的意思,在网页设计中我们称为网页的意思。现广泛译作网络、互联网等技术领域。表现为三种形式,即超文本(hypertext)、超媒体(hypermedia)、超文本传输协议(HTTP)等。如下图:
Web服务器
Internet上的服务器也成为Web服务器,是一台在Internet上具有独立IP地址的计算机,可以向Internet上的客户机提供各种Internet服务。如下图:
Web服务程序
单独的web服务器是无法完成请求与响应的,因为计算机只有安装软件才可以工作,所以真正处理web请求与响应的是web服务程序的作用,所以web服务程序的作用,所以网上也有web服务器直接称为web服务程序原因就是这个。如下图:
HTTP
超文本传输协议(HTTP-Hypertext transfer protocol)是一种详细规定了浏览器和web服务器之间相互通信的规则,HTTP请求和响应构成,是一种标准的客户端服务器模型。
http通常使用get或post方式进行请求:
用途上的区别是:get用于请求获取资源,比如获取一条新闻;而post用于提交更新资源,比如在论坛发布文章;
使用方法的区别是:get请求需要将请求的参数写在http的url中;而post请求是将请求的数据放在网页的Form表单中提交。
TCP/IP
协议是用来描述程序之间信息交换数据时的规则术语。在计算机网络中,两个相互通信的程序处在不同的地理位置,需要通过交换信息来满足某种需求,而信息的交换必须按照预先共同约定好的规则进行。
TCP/IP协议作为互联网的基础协议,没有就根本不可能上网,任何和互联网有关的操作都离不开TCP/IP协议。TCP/IP协议不是TCP和IP这两个协议的合称,而是指因特网整个TCP/IP协议簇。
从协议分层模型方面来讲,TCP/IP由四个层次组成:网络接口层、网络层、传输层、应用层。
TCP
TCP是一种面向连接的协议,提供可靠的数据传输,一般服务质量要求比较高的情况,使用这个协议。TCP支持的应用协议主要有:Telnet、FTP、SMTP、HTTP等;
UDP
UDP---用户数据报协议,是一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。UDP支持的应用层协议主要有:NFS(网络文件系统)、SNMP(简单网络管理协议)、DNS(主域名称系统)、TFTP(通用文件传输协议)等。
客户端/服务器模式
客户端(Client)向服务器(Server)发出请求,服务器处理请求,处理完成向客户端响应。如下图:
3 什么是Webservice?
为了方便广大网民日常查询需求,通过便民网站可以查询手机号码、ip地址、天气等信息。
以上功能如何实现呢?
通常我么你写的javaweb应用从数据库查询数据,如下图:
实时天气信息在我们的系统数据库中是不存在出的,这时就需要通过一种接口技术调用存有天气数据的系统,通过这个接口将信息实时获取过来在便民查询网站展示。但是对方系统的环境我们是不知道的,这种接口技术必须是可以跨平台访问的。
而webservice技术是一种跨平台的远程调用技术。
客户端/服务器通信:
TCP是一种面向连接的协议,提供可靠的数据传输,一般服务质量要求比较高的情况,使用这个协议。TCP支持的应用协议主要有:Telnet、FTP、SMTP、HTTP等。
UDP---用户数据报协议,是一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。UDP支持的应用协议主要有:NFS(网络文件系统)、SNMP(简单网络管理协议)、DNS(主域名称系统)、TFTP(通用文件传输协议)等。
由于TCP协议具体有的可靠性的特点本功能选择TCP协议通信获取天气信息。
Socket实现
javaSocket通信原理
- 第一步:服务端创建serverSocket,启动服务,监听端口
- 第二步:客户端创建socket,连接服务端
- 第三步:客户端通过outputstream发送数据至服务端
- 第四步:服务端通过inputstream接收客户端发送的数据
- 第五步:服务端处理完毕通过outputstream发送数据至客户端
- 第六步:客户端通过inputstream接收服务端发送的数据
Socket服务端
public class SocketServer {
public static void main(String[] args) throws IOException {
//启动socket服务端
ServerSocket serverSocket = new ServerSocket(12345);
System.out.println("服务端已启动。。。");
DataInputStream dataInputStream=null;
DataOutputStream dataOutputStream=null;
while(true){
try {
//监听客户端链接
//accept方法是阻塞方法
Socket socket= serverSocket.accept();
//输入流,使用此流接收数据
dataInputStream = new DataInputStream(socket.getInputStream());
//得到输出流,使用此流发送数据
dataOutputStream = new DataOutputStream(socket.getOutputStream());
//城市名称
String cityName = dataInputStream.readUTF();
System.out.println("from client.."+cityName);
//查询天气
String result = "晴转阴";
//将天气查询结果发送给客户端
dataOutputStream.writeUTF(result);
System.out.println("to client..."+result);
} catch (Exception e) {
e.printStackTrace();
}finally{
//资源释放
if(dataInputStream!=null){
dataInputStream.close();
}
if(dataOutputStream!=null){
dataOutputStream.close();
}
}
}
}
}
Socket客户端
public class SocketClient {
public static void main(String[] args) throws UnknownHostException, IOException {
Socket socket=null;
DataOutputStream dataOutputStream=null;
DataInputStream dataInputStream=null;
try {
//创建socket链接
socket = new Socket("127.0.0.1", 12345);
//发送数据
//得到输出流
dataOutputStream = new DataOutputStream(socket.getOutputStream());
//发送城市名称
String cityName="北京";
dataOutputStream.writeUTF(cityName);
System.out.println("to server..."+cityName);
//接收数据
//得到输入流
dataInputStream = new DataInputStream(socket.getInputStream());
//接收服务端返回的天气查询结果
String result = dataInputStream.readUTF();
System.out.println("from server..."+result);
} catch (Exception e) {
e.printStackTrace();
}finally{
//释放资源
if(socket!=null){
socket.close();
}
if(dataInputStream!=null){
dataInputStream.close();
}
if(dataOutputStream!=null){
dataOutputStream.close();
}
}
}
}
Webservice实现
jax-ws介绍
JAX-WS 的全称为 Java API for XML-Based Webservices ,从java5开始支持JAX-WS2.0版本,Jdk1.6.0_13以后的版本支持2.1版本,jdk1.7支持2.2版本。运行的环境是jdk8。
第一个例子
目录结构如下:
其中werbservice_04_jaxws_first_client项目的cn.itcast.webservice.jaxws.server包生成是通过 以下语句 生成的:
wsimport -s . http://127.0.0.1:12345/weather?wsdl
注意:在生成cn.itcast.webservice.jaxws.server包时,是还没有建立cn.itcast.webservice.jaxws.client包,即在新建项目时就生成cn.itcast.webservice.jaxws.server包。关于http://127.0.0.1:12345/weather?wsdl服务的获取是在werbservice_03_jaxws_first_server的服务启动后即可获取
具体步骤如下:
第一步:服务端开发
1 编写SEI(Service Endpoint Interface),SEI在webservice中称为port,在java中称为接口,接口类型叫portType。
代码如下:
public interface WeatherInterface {
//天气查询
public String queryWeather(String cityName);
}
2 编写SEI实现类,此类作为webservice提供服务类
代码如下:
@WebService
public class WeatherInterfaceImpl implements WeatherInterface {
@Override
public String queryWeather(String cityName) {
System.out.println("from client.."+cityName);
String result = "晴朗";
System.out.println("to client..."+result);
return result;
}
public static void main(String[] args) {
//发送webservice服务
Endpoint.publish("http://192.168.1.100:1234/weather", new WeatherInterfaceImpl());
}
}
注意:
SEI实现类中至少要有一个非静态的公开方法需要作为webservice服务方法。
public class 上边要加上@WebService
3 endpoint发布服务
public class Server {
public static void main(String[] args) {
//发送天气查询服务
Endpoint.publish("http://127.0.0.1:12345/weather", new WeatherInterfaceImpl());
System.out.println("发布webservice服务");
}
}
在启动服务之后,可以通过在浏览器输入如下,进行查看wsdl文件
关于wsdl文档的使用,可以看看这篇文章:关于webservice中生成客户端的wsdl文档使用解读
第二部:wsimport 生成客户端调用类
wsimport介绍
wsimport是jdk自带的,可以根据wsdl文档成成客户端调用代码的工具,当然,无论服务器端的webservice是用什么语言写的,都将在客户端生成java代码,生成的类文件理解成socket调用骨架。服务器端用什么写的并不重要,客户端调用生成的类从而实现发送soap数据。
常用参数为:
-d<目录> -- 将生成.class文件。默认参数。
-s<目录> -- 将生成.java文件
-p<生成的新包名> -- 将生成的类,放于指定包下。
(wsdlurl) - http://server:port/service?wsdl,必须的参数。
示例:
C:/> wsimport –s . http://127.0.0.1:1234/weather?wsdl
注意:-s不能分开,-s后面有个小点
客户端生成注意事项:
1 可以通过java -version检查你当前的版本号,如果版本过低可以安装高版本的jdk。如果在使用wsimport命令不可用时,需要配置java的path的绝对路径,如:C:\Program Files\Java\jdk1.8.0_181\bin。
如果不想修改原来已经配置好的环境变量,可以命令行窗口输入以下命令,使jdk1.6.0_24生效:
set path = C:\Program Files\Java\jdk1.8.0_181\bin;%PATH%(回车即可)
再通过java –version查看jdk的版本号是否已经发生变化.
2 在Eclipse中创建一个空的java工程为wsimport,此工程为存放客户端代码。
3 cmd命令行进入此wsimport工程的src目录。
输入以下命令:
参数说明:-s是指编译出源代码文件,后面的.(点)指將代码放到当前目录下.
最后面的http….是指获取wsdl说明书的地址.
生成完成,刷新Eclipse中wsimport工程,将src下生成.java文件代码Copy到webservice客户端工程(见下)中。
第三步:客户端编写
代码如下:
public class WeatherClient {
public static void main(String[] args) {
//创建服务视图
WeatherInterfaceImplService weatherInterfaceImplService =new WeatherInterfaceImplService();
//通过服务视图得到服务端点
WeatherInterfaceImpl weatherInterfaceImpl= weatherInterfaceImplService.getPort(WeatherInterfaceImpl.class);
//调用webservice服务方法
String result = weatherInterfaceImpl.queryWeather("郑州");
System.out.println(result);
}
}
什么是webservice?
- Web service即web服务,因为互联网而产生,发布web服务可以将资源进行共享,通过webservice调用获取并操作资源信息。
- webservice是一种跨变成语言和跨操作系统平台的远程调用技术即跨平台远程调用技术。
- 采用标准SOAP(Simple Object Access Protocol)传输协议,soap属于w3c标准。
- 基于http传输xml,即soap=http+xml
- 采用wsdl作为描述语言即webservice使用说明,wsdl属于w3c标准
- xml和XSD(XML Sehema Datatypes)是webservice的跨平台的基础,XML主要的优点在于它即与平台无关,又与厂商无关。XML是由万维网协会(W3C)创建的,W3C制定的XSD定义了一套标准的数据类型,数据类型用xml进行描述。
webService三要素
soap
SOAP即简单对象访问协议(Simple Object Access Protocal)是一种简单的基于XML的协议,它使应用程序通过HTTP来交换信息,简单理解为soap=http+xml。
Soap协议版本主要使用soap1.1、soap1.2
SOAP可以运行在任何其他应用协议上。例如,SMTP、tr069等。
WSDL
wsdl是一种基于XML的用于描述Web Service及其函数、参数和返回值。通俗理解WSDL是webservice的使用说明书。
UDDI
UDDI是一种目录服务,通过它,企业可注册并搜索Web services。企业将自己提供的Web Service注册在UDDI,也可以使用别的企业在UDDI注册的web service服务,从而达到资源共享。
UDDI旨在将全球的webservcie资源进行共享,促进全球经济合作。
但是使用webservice并不是必须使用UDDI,因为很多时候使用者已经知道了 Web service地址并进行调用。
webService应用场景
应用程序集成
分布式程序之间进行集成使用webservice直接调用服务层方法,不仅缩短了开发周期,还减少了代码复杂度,并能够增强应用程序的可维护性。
软件重用
将一个软件的功能以webservice方式暴露出来,达到软件重用。例如上边分析的天气预报,将天气查询功能以webservice接口方式暴露出来非常容易集成在其它系统中;再比如一个第三方物流系统将快递查询、快递登记暴露出来,从而集成在电子商务系统中。
跨防火墙通信
如果一个大型系统是基于web的且用户分布在世界各地,除了以浏览器访问系统页面外,如果使用其它客户端访问服务器的功能,客户端和服务器通信问题是大的问题,因为客户端和服务器之间通常会有防火墙或者代理服务器,这时如果使用webservice开发功能就可以很容易跨越防火墙,因为webservice和网页程序都是运行在web容器且用相同的端口和协议。
建议不用webservice
单机程序间通信
这里说的单机程序是指一个厂家开发的多个应用部署在一台服务器,当程序之间需要通信且无需将接口暴露给第三方系统时完全没有必要使用webservice技术,这时企业自定义一种简单的接口协议即可,简单高效。
同构程序间通信
同构程序是指采用相同的编程语言的程序之间通信,比如java远程调用RMi技术就可以非常高效的实现远程调用,使用简单方便,必需保证两边应用都是java编写才可使用。
总之,只要有其它方法比webservice更高效更可行就不要用webservice,因为web跨平台远程调用方法不止webservice一种,需要择优考虑。
建议使用webservice
公开接口
面向互联网公开的接口,例如:某公司产品促销介绍、股票信息查询等,因为webservice是互联网的一个标准协议,将接口发布为webservice,其它公司很容易使用。
调用webservice服务端
你作为客户端要调用别人的接口,对方接口用的是webservice,这时你也用webservice开发客户端,且协议版本要和服务端保持一致。
Webservice优缺点
优点:
1 、采用xml支持跨平台远程调用。
2、基于http的soap协议,可跨越防火墙。
3、支持面向对象开发。
4、有利于软件和数据重用,实现松耦合。
缺点:
1、 由于soap是基于xml传输,本身使用xml传输会传输一些无关的东西从而效率不高,随着soap协议的完善,soap协议增加了许多内容,这样就导致了使用soap协议去完成简单的数据传输的效率更加不高。
2、 webservice作为web跨平台访问的标准技术,很多公司都限定要求使用webservice,其实对于简单的接口如果直接用http传输自定义数据内容比webservice开发更快捷,例如第三方支付公司的支持接口。
现状前景
就目前来看Webservice主要是作为一种远程调用技术而存在,而远程调用的技术非常多,比webservice简单方便的也有,比如http。但是随是SOA的兴起,面向服务构建应用的模式被推崇,随着webservice标准的规范,相信Web服务将是未来应用架构的一个极为重要的模式,随着Web服务的深入人心,会有越来越多的应用采用Web服务架构开发,Web服务的需求将不断增加。
像一些互联网开发商yahoo、eBay及亚马逊等,都提供了自己的Web服务,大大推动了企业B2B的进程。将来会有更多企业开放自己的Web服务,从中获得更多的效益,这一切都由web服务所带来的,当然web服务正在发展肯定还有更精彩的前景等待人们去开发。