1. 基础概念
1.1Web
web的本意是蜘蛛网和网的意思,在网页设计中我们称为网页的意思。现广泛译作网络、互联网等技术领域。表现为三种形式,即超文本(hypertext)、超媒体(hypermedia)、超文本传输协议(HTTP)等。 如下图:
1.2 Web服务器
Internet上的服务器也称为Web服务器,是一台在Internet上具有独立IP地址的计算机,可以向Internet上的客户机提供各种Internet服务。如下图:
1.3Web服务程序
单独的web服务器是无法完成请求与响应的,因为计算机只有安装软件才可以工作,所以真正处理web请求与响应的是web服务程序的作用,所以网上也有将web服务器直接称为web服务程序原因就是这个。如下图:
1.4HTTP
超文本传输协议 (HTTP-Hypertext transfer protocol)是一种详细规定了浏览器和Web服务器之间互相通信的规则,HTTP由请求和响应构成,是一个标准的客户端服务器模型。
http通常使用get或post方式进行请求:
用途上的区别是:get用于请求获取资源,比如获取一条新闻;而post用于提交更新资源,比如在论坛发布文章;
使用方法上的区别是:get请求需要将请求的参数写在http的url中;而post请求是将请求的数据放在网页的Form表单中提交。
TCP/IP
协议是用来描述程序之间信息交换数据时的规则术语。在计算机网络中,两个相互通信的程序处在不同的地理位置,需要通过交换信息来满足某种需求,而信息的交换必须按照预先共同约定好的规则进行。要想让两台计算机进行通信,必须使它们采用相同的信息交换规则。我们把在计算机网络中用于规定信息的格式以及如何发送和接收信息的一套规则称为网络协议(network protocol)或通信协议。
其中图5.8(a)是OSI的七层协议体系结构,图、图5.8(b)是TCP/IP四层体系结构、图5.8(c)是五层协议的体系结构。五层协议的体系结构综合了前两种体系结构的优点,既简洁又能将概念阐述清楚。
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(通用文件传输协议)等。
Sokect
要想理解socket首先得熟悉一下TCP/IP协议族, TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,定义了主机如何连入因特网及数据如何再它们之间传输的标准,
从字面意思来看TCP/IP是TCP和IP协议的合称,但实际上TCP/IP协议是指因特网整个TCP/IP协议族。不同于ISO模型的七个分层,TCP/IP协议参考模型把所有的TCP/IP系列协议归类到四个抽象层中
应用层:TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 等等
传输层:TCP,UDP
网络层:IP,ICMP,OSPF,EIGRP,IGMP
数据链路层:SLIP,CSLIP,PPP,MTU
每一抽象层建立在低一层提供的服务上,并且为高一层提供服务,看起来大概是这样子的
估计有兴趣打开此文的同学都对此有一定了解了,加上我也是一知半解,所以就不详细解释,有兴趣同学可以上网上搜一下资料
在TCP/IP协议中两个因特网主机通过两个路由器和对应的层连接。各主机上的应用通过一些数据通道相互执行读取操作
socket
我们知道两个进程如果需要进行通讯最基本的一个前提能能够唯一的标示一个进程,在本地进程通讯中我们可以使用PID来唯一标示一个进程,但PID只在本地唯一,网络中的两个进程PID冲突几率很大,这时候我们需要另辟它径了,我们知道IP层的ip地址可以唯一标示主机,而TCP层协议和端口号可以唯一标示主机的一个进程,这样我们可以利用ip地址+协议+端口号唯一标示网络中的一个进程。
能够唯一标示网络中的进程后,它们就可以利用socket进行通信了,什么是socket呢?我们经常把socket翻译为套接字,socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用以实现进程在网络中通信。
socket起源于UNIX,在Unix一切皆文件哲学的思想下,socket是一种"打开—读/写—关闭"模式的实现,服务器和客户端各自维护一个"文件",在建立连接打开后,可以向自己文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件。
socket通信流程
socket是"打开—读/写—关闭"模式的实现,以使用TCP协议通讯的socket为例,其交互流程大概是这样子的
服务器根据地址类型(ipv4,ipv6)、socket类型、协议创建socket
服务器为socket绑定ip地址和端口号
服务器socket监听端口号请求,随时准备接收客户端发来的连接,这时候服务器的socket并没有被打开
客户端创建socket
客户端打开socket,根据服务器ip地址和端口号试图连接服务器socket
服务器socket接收到客户端socket请求,被动打开,开始接收客户端请求,直到客户端返回连接信息。这时候socket进入阻塞状态,所谓阻塞即accept()方法一直到客户端返回连接信息后才返回,开始接收下一个客户端谅解请求
客户端连接成功,向服务器发送连接状态信息
服务器accept方法返回,连接成功
客户端向socket写入信息
服务器读取信息
客户端关闭
服务器端关闭
三次握手
在TCP/IP协议中,TCP协议通过三次握手建立一个可靠的连接
第一次握手:客户端尝试连接服务器,向服务器发送syn包(同步序列编号Synchronize Sequence Numbers),syn=j,客户端进入SYN_SEND状态等待服务器确认
第二次握手:服务器接收客户端syn包并确认(ack=j+1),同时向客户端发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手
定睛一看,服务器socket与客户端socket建立连接的部分其实就是大名鼎鼎的三次握手
客户端/服务器模式
客户端(Client)向服务器(Server)发出请求,服务器处理请求,处理完成向客户端响应。如下图:
2. 客户端/服务器通信
便民查询网站分析
为了方便广大网民日常查询需求,通过便民查询网站可以查询手机号、ip地址、天气等信息。
以上功能如何实现?
通常我们写的javaweb应用从数据库查询数据,如下图:
实时天气信息在我们的系统数据库中是不存在的,这时就需要通过一种接口技术调用存有天气数据的系统,通过这个接口将天气信息实时获取过来在便民查询网站展示。但是对方系统的环境我们是不知道的,这种接口技术必须是可以跨平台访问的。
我们今天讲的webservice是一种跨平台的远程调用技术。
客户端/服务器通信:
TCP是一种面向连接的协议,提供可靠的数据传输,一般服务质量要求比较高的情况,使用这个协议。TCP支持的应用协议主要有:Telnet、FTP、SMTP、HTTP等;
UDP---用户数据报协议,是一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。UDP支持的应用层协议主要有:NFS(网络文件系统)、SNMP(简单网络管理协议)、DNS(主域名称系统)、TFTP(通用文件传输协议)等。
由于TCP协议具体有的可靠性的特点本功能选择TCP协议通信获取天气信息。
Socket实现
Socket通信原理
第一步:服务端创建serverSocket,启动服务、监听端口
第二步:客户端创建socket,连接服务端
第三步:客户端通过outputstream发送数据至服务端
第四步:服务端通过inputstream接收客户端发送的数据
第五步:服务端处理完毕通过outputstream发送数据至客户端
第六步:客户端通过inputstream接收服务端发送的数据
Socket服务端:
/**
* 天气查询服务端
* @author 传智播客 Java学院 苗润土
* @version V1.0
*/
public class WeatherServer {
public static void main(String[] args) throws IOException {
//创建socket服务端对象
ServerSocket serverSocket = new ServerSocket(1234);
System.out.println("服务端已启动。。。。");
while(true){
//监听客户端连接,accept方法为阻塞方法
Socket socket = serverSocket.accept();
//获取输入流准备取客户端发送的数据
DataInputStream dataInputStream =null;
DataOutputStream dataOutputStream =null;
try {
//包括为datainputstream
dataInputStream = new DataInputStream(socket.getInputStream());
//读取数据
String in_data = dataInputStream.readUTF();
//打印读取的数据
System.out.println("from client.."+in_data);
//创建输出流准备输出数据
dataOutputStream = new DataOutputStream(socket.getOutputStream());
System.out.println("to client..."+"晴朗");
dataOutputStream.writeUTF("晴朗");
} catch (Exception e) {
e.printStackTrace();
}finally{
//释放资源
if(dataOutputStream!=null){
dataOutputStream.close();
}
if(dataInputStream!=null){
dataInputStream.close();
}
}
}
}
}
Socket客户端
/**
* 天气查询客户端
* @author 传智播客 Java学院 苗润土
* @version V1.0
*/
public class WeatherClient {
public static void main(String[] args) throws UnknownHostException, IOException {
while(true){
//socket客户端对象
Socket socket = null;
//输出流用于发送数据
DataOutputStream dataOutputStream = null;
//输入流用于接收数据
DataInputStream dataInputStream = null;
try {
//创建socket
socket = new Socket("127.0.0.1", 1234);
socket.setSoTimeout(10000);//超时时间为10秒,防止服务端处理超时返回数据失败
//创建输出流准备向服务端发送数据
dataOutputStream = new DataOutputStream(socket.getOutputStream());
dataOutputStream.writeUTF("郑州");
System.out.println("to server...."+"郑州");
//接收服务端发送的数据
dataInputStream = new DataInputStream(socket.getInputStream());
String resultString = dataInputStream.readUTF();
System.out.println("from server..."+resultString);
} catch (Exception e) {
e.printStackTrace();
}finally{
//释放资源
if(socket!=null){
socket.close();
}
if(dataOutputStream!=null){
dataOutputStream.close();
}
if(dataInputStream!=null){
dataInputStream.close();
}
}
}
}
}
3.什么是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 Schema Datatypes)是webservice的跨平台的基础,XML主要的优点在于它既与平台无关,又与厂商无关。XML是由万维网协会(W3C)创建,W3C制定的XSD定义了一套标准的数据类型,数据类型用xml进行描述。
3.1webService三要素
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地址并进行调用。
4.webService应用场景
1. 应用程序集成
分布式程序之间进行集成使用webservice直接调用服务层方法,不仅缩短了开发周期,还减少了代码复杂度,并能够增强应用程序的可维护性。
2. 软件重用
将一个软件的功能以webservice方式暴露出来,达到软件重用。例如上边分析的天气预报,将天气查询功能以webservice接口方式暴露出来非常容易集成在其它系统中;再比如一个第三方物流系统将快递查询、快递登记暴露出来,从而集成在电子商务系统中。
3. 跨防火墙通信
如果一个大型系统是基于web的且用户分布在世界各地,除了以浏览器访问系统页面外,如果使用其它客户端访问服务器的功能,客户端和服务器通信问题是大的问题,因为客户端和服务器之间通常会有防火墙或者代理服务器,这时如果使用webservice开发功能就可以很容易跨越防火墙,因为webservice和网页程序都是运行在web容器且用相同的端口和协议。
建议不用webservice
1. 单机程序间通信
这里说的单机程序是指一个厂家开发的多个应用部署在一台服务器,当程序之间需要通信且无需将接口暴露给第三方系统时完全没有必要使用webservice技术,这时企业自定义一种简单的接口协议即可,简单高效。
2. 同构程序间通信
同构程序是指采用相同的编程语言的程序之间通信,比如java远程调用RMi技术就可以非常高效的实现远程调用,使用简单方便,必需保证两边应用都是java编写才可使用。
总之,只要有其它方法比webservice更高效更可行就不要用webservice,因为web跨平台远程调用方法不止webservice一种,需要择优考虑。
建议使用webservice
1. 公开接口
面向互联网公开的接口,例如:某公司产品促销介绍、股票信息查询等,因为webservice是互联网的一个标准协议,将接口发布为webservice,其它公司很容易使用。
2. 调用webservice服务端
你作为客户端要调用别人的接口,对方接口用的是webservice,这时你也用webservice开发客户端,且协议版本要和服务端保持一致。
5.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服务正在发展肯定还有更精彩的前景等待人们去开发。