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 安全通道建立信任关系。

Java RMI地址解析问题

当我们在webservice.asmx.cs中编写所有代码时,webservice.asmx有啥用?

自动生成webservice客户端代码后怎么调用

在idea中,怎么生成cxf webservice的客户端代码

如何调用webservice接口 ajax