Socket实现

javaSocket通信原理

第一步:服务端创建serverSocket,启动服务、监听端口

/**
* 天气查询服务端
* @author SMN
* @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 SMN
* @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();
} }
}
}
}

第一个例子

第一步:服务端开发

1.编写SEI(Service Endpoint Interface),SEI在webservice中称为portType,在java中称为接口。

/**
* 天气查询服务接口
* @author SMN
* @version V1.0
*/
public interface WeatherInterface {
//天气查询
public String queryWeather(String cityName);
}

2.编写SEI实现类,此类作为webservice提供服务类

/**
* 天气查询服务接口实现类
* @author SMN
* @version V1.0
*/
@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发布服务,代码在实现类的主方法中

第二步:查看wsdl

Webservice发布成功,通过wsdl查看webservice发布的正确性

1.在地址栏输入(注意后面的参数?wsdl)

http://192.168.1.100:1234/weather?wsdl

2.Wsdl不是webService,只是获取一个用于描述WebService的说明文件

3.wsdl- WebServiceDescriptionLanguage,是以XML文件形式来描述WebService的”说明书”,有了说明书,我们才可以知道如何使用或是调用这个服务.

第三步:Wsimport生成客户端调用类

Wsimport介绍

wsimport是jdk自带的webservice客户端工具,可以根据wsdl文档生成客户端调用代码(java代码).当然,无论服务器端的WebService是用什么语言写的,都可以生成调用webservice的客户端代码,服务端通过客户端代码调用webservice。

wsimport.exe位于JAVA_HOME\bin目录下.

常用参数为:

-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检查你当前的版本号保存是jdk1.6以上。Jdk1.6.0_13以后的版本支持jaxws2.1。
  2. 在Eclipse中创建一个空的java工程为wsimport,此工程作为存放客户端代码。
  3. cmd命令行进入此wsimport 工程的src目录,

输入以下命令:

参数说明:-s是指编译出源代码文件,后面的.(点)指將代码放到当前目录下.

最后面的http….是指获取wsdl说明书的地址.

  

如果wsdl文件在本地,可以这样使用:Wsimport –s . file:///d:\WeatherWebService.wsdl

注意:这里可能会遇到类似这样的错误:

我们可以把wsdl文件下载到本地,删除掉文件中所有的<s:element ref="s:schema"/>即可解决

  4.生成完成,刷新Eclipse中wsimport工程,将src下生成.java文件代码Copy到webservice客户端工程(见下)中。

第四步:客户端编写

/**
* 天气查询客户端
* @author SMN
* @version V1.0
*/
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工作原理:

Socket  是基于TCP/ip的传输层协议

Webservice是基于http协议传输数据,http是基于tcp的应用层协议

Webservice采用了基于http的soap协议传输数据。

Socket接口通过流传输,不支持面向对象。

Webservice 接口支持面向对象,最终webservice将对象进行序列化后通过流传输。

结论:

Webservice采用soap协议进行通信,底层基于socket通信,webservice不需专门针对数据流的发送和接收进行处理,是一种跨平台的面向对象远程调用技术。

Socket和webservice:应用场景

Socket适用于传输大数量的数据,缺点:接口传输的数据需要手动解析,socket通信的接口协议需要自定义,比如:自定义一种字符串拼接的格式,比如自定义的xml数据,自定义麻烦之处在接口调用方和接口服务端需要互相讨论确定接口的协议内容,不方便,好处:适用于传输大数量的数据。

Webservcie,由于是遵循标准的soap协议,soap 协议的内容格式固定,soap协议传递的内容是xml数据,由于webservice是基于http的,所以简单理解为soap=http+xml,适用于没有性能要求情况下且数据传输量小,推荐在公开接口上使用webservice,因为soap协议的标准的。

什么是webservice?

  Web service 即web服务,它是一种跨编程语言和跨操作系统平台的远程调用技术即跨平台远程调用技术。

  采用标准SOAP(Simple Object Access Protocol)  协议传输,soap属于w3c标准。Soap协议是基于http的应用层协议,soap协议传输是xml数据。

  采用wsdl作为描述语言即webservice使用说明书,wsdl属w3c标准。

  xml是webservice的跨平台的基础,XML主要的优点在于它既与平台无关,又与厂商无关。

  XSD,W3C为webservice制定了一套传输数据类型,使用xml进行描述,即XSD(XML Schema Datatypes),任何编程语言写的webservice接口在发送数据时都要转换成webservice标准的XSD发送。

webService三要素

soap

SOAP即简单对象访问协议(Simple Object Access Protocal) 是一种简单的基于 XML 的协议,它使应用程序通过 HTTP 来交换信息,简单理解为soap=http+xml。

Soap协议版本主要使用soap1.1、soap1.2

SOAP不是webservice的专有协议,其他应用协议也使用soap传输数据。例如,SMTP、tr069等。

wsdl

WSDL 是基于 XML 的用于描述Web Service及其函数、参数和返回值。通俗理解Wsdl是webservice的使用说明书。

UDDI

UDDI 是一种目录服务,通过它,企业可注册并搜索 Web services。企业将自己提供的Web Service注册在UDDI,也可以使用别的企业在UDDI注册的web service服务,从而达到资源共享。

UDDI旨在将全球的webservcie资源进行共享,促进全球经济合作。

但是使用webservice并不是必须使用UDDI,因为用户通过WSDL知道了web service的地址,可以直接通过WSDL调用webservice。

WSDL

wsdl 说明书结构

<service>     整个webservice的服务视图,它包括了所有的服务端点

<binding>     为每个端口定义消息格式和协议细节

<portType>  描述 web service可被执行的操作,以及相关的消息,通过binding指向portType

<message>   定义一个操作(方法)的数据参数(可有多个参数)

<types>        定义 web service 使用的全部数据类型

wsdl 说明书阅读方式

从下往上读

先找到服务视图,通过binging找到protType,找到了protType就找到了我们要调用的webservice方法。

查看wsdl说明要从下往上看:

1服务视图(根)

2通过服务视图,bingding到porttype

3、调用portType的方法

使用javax.xml.ws.Service进行客户端编程(常用方法)

步骤

第一步:创建URL,指定资源地址即wsdl地址

第二步:创建Qname,指定命名空间和视图名称

第三步:创建服务视图对象service

第四步:从服务视图中得到服务端点即服务接口(这里需要服务接口类型,可使用wsimport生成后只留下porttype)

第五步:通过服务端点调用服务方法

/**
* 使用javax.xml.ws.Service调用webservice服务
* @author SMN
* @version V1.0
*/
public class WeatherClient2 {
public static void main(String[] args) throws MalformedURLException {
//定义url,参数为wsdl地址
URL url = new URL("http://192.168.1.100:1234/weather?wsdl");
//定义qname,第一个参数是命名空间,第二个参数名称是wsdl里边的服务名
QName qName = new QName("http://impl.sei.jaxws.ws.itcast.cn/", "WeatherInterfaceImplService");
//创建服务视图
Service service = Service.create(url, qName);
//通过服务视图得到服务端点
WeatherInterfaceImpl weatherInterfaceImpl =service.getPort(WeatherInterfaceImpl.class);
//调用webservice
System.out.println(weatherInterfaceImpl.queryWeather("郑州"));
}
}

使用Service调用和Wsimport代码调用方式区别:

Wsimport生成代码调用webservice无法指定webservice的地址,使用生成的服务视图类获取服务端点(postType)实例。

Service调用Webservice可以指定webservice的地址,只需要服务端点的接口即可获取服务端点实例。

WebService使用介绍(一)的更多相关文章

  1. WebService的介绍概念 收藏

    WebService学习总结(二)——WebService相关概念介绍 一.WebService是什么? 1. 基于Web的服务:服务器端整出一些资源让客户端应用访问(获取数据) 2. 一个跨语言.跨 ...

  2. WebService相关概念介绍

    最近重新拾起WebService,之前用过Axis2开发过服务,但是非常具体的概念还不是很清楚,在此粗略总结一下. 本文重点研究以下几个问题:     1.WebService以及相关的概念介绍    ...

  3. webService的介绍与简单使用

    webService开发项目介绍: 1 Webservice:跨语言跨平台的远程调用技术.Web service 即web服务,它是一种跨编程语言和跨操作系统平台的远程调用技术即跨平台远程调用技术. ...

  4. WebService—规范介绍和几种实现WebService的框架介绍

    一.关于SOA(面向服务架构)思想   1.关于协议   2.SOA 的诞生 SOA(Service-Oriented Architecture)面向服务架构是一种思想,它将应用程序的不同功能单元通过 ...

  5. WebService学习总结(二)——WebService相关概念介绍

    一.WebService是什么? 1. 基于Web的服务:服务器端整出一些资源让客户端应用访问(获取数据) 2. 一个跨语言.跨平台的规范(抽象) 3. 多个跨平台.跨语言的应用间通信整合的方案(实际 ...

  6. WebService简单介绍

    什么是Web Services 一直没有一个明确的答案,最近听了一个大牛讲WebService,顿时明了了,作个记录免得以后忘了. N年之前,各公司都在炒作SOA,不过现在已经没人再提了,现在都改叫W ...

  7. WebService学习--(二)webservice相关介绍

    一.WebService是什么? 1. 基于Web的服务:服务器端整出一些资源让客户端应用访问(获取数据) 2. 一个跨语言.跨平台的规范(抽象) 3. 多个跨平台.跨语言的应用间通信整合的方案(实际 ...

  8. WebService简单介绍(一)

    分布式系统或软件如何通信?使用WebService服务.说它是服务可以,web通信中间件也ok,web通信组件....... 特点 自包含 自描述 跨平台.跨语言 基于开放和标准 (用了xml,嗯,开 ...

  9. WebService - 术语介绍

    一.WebService是什么? 1. 基于Web的服务:服务器端整出一些资源让客户端应用访问(获取数据) 2. 一个跨语言.跨平台的规范(抽象) 3. 多个跨平台.跨语言的应用间通信整合的方案(实际 ...

随机推荐

  1. Java分享笔记:RandomAccessFile流 & 在文件指定位置插入内容

    RandomAccessFile流:随机存取文件流,该类定义了一个记录指针,通过移动指针可以访问文件的任意位置,且对文件既可以读也可以写.使用该类的write方法对文件写入时,实际上是一种覆盖效果,即 ...

  2. Linux的开山篇

    一.Linux的学习方向 1.2Linux运维工程师 1.2.2Linux嵌入式开发工程师 1.2.3在Linux下做各种程序开发    javaEE   大数据    Python  PHP  C/ ...

  3. linux下mysql主从复制,实现数据库同步

    运行环境: 查看linux版本命令:lsb_release -a 主服务器:centos release 6.5 mysql 5.6.10-log  IP:172.17.200.25从服务器:cent ...

  4. SSM项目中用ajax尝试实现controller请求中重定向不起作用的问题

    首先我在controller中有一个添加数据的方法: @RequestMapping(value="/emp",method=RequestMethod.POST) public ...

  5. 01-HTML深入

    1.1  浏览器的工作原理 把一些标签解析成用户可视化的页面 1.2 HTML中的标签与元素 在HTML中以<xx>开始,以</xx>结束,比如<html>< ...

  6. JDK8 新特性

    JDK8 新特性目录导航: Lambda 表达式 函数式接口 方法引用.构造器引用和数组引用 接口支持默认方法和静态方法 Stream API 增强类型推断 新的日期时间 API Optional 类 ...

  7. Mysql基础3-数据操作语言DML-数据查询语言DQL

    主要: 数据操作语言DML 数据查询语言DQL 数据操作语言DML DML: Data Mutipulation Language 插入数据(增) 一般插入数据形式 1)形式1: insert [in ...

  8. vi/vim连续注释

    知识点: 1-可视块模式方法 2-替换方法 3-自定义快捷键方式 今天刚好重新在linux上手工搭建完Lamp环境,用来下vi操作,一段时间不用就有些生疏了,正好经常要注释,回顾下自己会的方法,小结一 ...

  9. Hadoop(2)-CentOS下的jdk和hadoop的安装与配置

    准备工作 下载jdk8和hadoop2.7.2 使用sftp的方式传到hadoop100上的/opt/software目录中 配置环境 如果安装虚拟机时选择了open java,请先卸载 rpm -q ...

  10. pyc是个什么鬼?

    1.Python是一门解释型语音? 我初学Python时,听到的关于Python的第一句话就是,Python是一门解释型语音,我就这样一直相信下去,知道发现了*.pyc文件的存在.如果是解释型语音,那 ...