初探webService

webService提供了一种规范,可以用于不同语言或者不同平台之间数据传输。

复习socket通信以便更好的理解ws。

socket通信图示:

平台a与平台b无法进行直接通信,通过socket进行通信。

socket通信举例(回复相同的字符串):

客户端

package com.bxw.client;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class SocketClient {
    private Socket socket;
    private OutputStream os;//输出流,获取用户输入的信息
    private InputStream is;//输入流,接受来自服务器的数据

    public SocketClient() {
    }
    /**
     * 构造方法
     * @param url
     * @param port
     */
    public SocketClient(String url,int port) {
        try {
            socket = new Socket(url, port);
            is = socket.getInputStream();
            os = socket.getOutputStream();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public Socket getSocket() {
        return socket;
    }
    public void setSocket(Socket socket) {
        this.socket = socket;
    }
    public OutputStream getOs() {
        return os;
    }
    public void setOs(OutputStream os) {
        this.os = os;
    }
    public InputStream getIs() {
        return is;
    }
    public void setIs(InputStream is) {
        this.is = is;
    }
    public void close(){
        try {
            os.close();
            is.close();
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        SocketClient sc = new SocketClient("127.0.0.1", 9999);//创建客户端
        Scanner scan = new Scanner(System.in);//控制台接受用户输入
        OutputStream os = sc.getOs();//获得输出流,到服务端
        InputStream is = sc.getIs();//获得输入流,用户输入
        String data="";
        while(!data.equals("bye")){
            System.out.println("------请输入要转化的字母------");
            data = scan.next();//获取控制台输入
            //写入到输出流
            try {
                os.write(data.getBytes());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        sc.close();
    }
}

服务端

package com.bxw.server;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class SocketServer {
    private ServerSocket ss;
    private OutputStream os;//输出流,输出到客户端处理过后的信息
    private InputStream is;//输入流,接受客户端的信息

    public SocketServer() {
    }

    public SocketServer(int port){
        try {
            ss = new ServerSocket(port);
            System.out.println("--------空闲中,等待请求--------");
            Socket socket = ss.accept();
            System.out.println("--------握手成功--------");
            while(true){
                is = socket.getInputStream();
                os = socket.getOutputStream();
                byte[] b = new byte[1024];
                int len = is.read(b);
                String data = new String(b, 0, len);
                System.out.println("客户端发来的数据为:"+data);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public ServerSocket getSs() {
        return ss;
    }

    public void setSs(ServerSocket ss) {
        this.ss = ss;
    }

    public OutputStream getOs() {
        return os;
    }

    public void setOs(OutputStream os) {
        this.os = os;
    }

    public InputStream getIs() {
        return is;
    }

    public void setIs(InputStream is) {
        this.is = is;
    }
    public void close(){
        try {
            is.close();
            os.close();
            ss.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

        public static void main(String[] args) {
        new SocketServer(9999);
    }
}
    

先开启服务端的程序,然后等待,一旦客户端向服务端发送消息,握手成功则该socket通信成功。

由于我们的项目大多是web项目,于是通过浏览器发起请求的方式访问socket服务。

服务端不变。

客户端采用jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>sockie客户端</title>
</head>
<body>
    <form name="form" action="http://localhost:9999" method="post">
        <input type="text" name="vname">
        <input type="submit" value="提交">
    </form>
</body>
</html>

运行结果:

显然这么一大串是不要的,我们只需要的是sname的信息。

以下记录如何调用已经封装好的ws。

http://www.webxml.com.cn,该站点提供了很多ws服务,请求ws服务的方式大致有以下几种(get,post,soap)

package com.bxw.client;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;

public class TranslateClient {
    /**
     * get请求
     * @param number
     * @throws HttpException
     * @throws IOException
     */
    private void get(String number) throws HttpException, IOException {
        HttpClient hc = new HttpClient();//创建一个浏览器对象
        //填写数据,指定发送get请求
        GetMethod gm = new GetMethod("http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx"
                + "/getMobileCodeInfo?mobileCode=" + number + "&userID=");
        gm.setRequestHeader("Content-Type", "text/xml; charset=utf-8");//指定传输格式
        int code = hc.executeMethod(gm);//发送请求
        System.out.println("该请求的状态码"+code);
        String result = gm.getResponseBodyAsString();
        System.out.println("返回的结果:"+result);
    }

    /**
     * post请求
     * @param number
     * @throws IOException
     * @throws HttpException
     */
    private void post(String number) throws HttpException, IOException {
        //HttpClient模拟http请求
        HttpClient hc = new HttpClient();//浏览器对象
        //post请求
        PostMethod pm = new PostMethod("http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx/getMobileCodeInfo");
        //指定post传输格式
        pm.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        //传输参数
        pm.setParameter("mobileCode", number);
        pm.setParameter("userId", "");
        //发送请求
        int code = hc.executeMethod(pm);
        System.out.println("状态码"+code);
        String result = pm.getResponseBodyAsString();
        System.out.println("结果"+result);
    }

    /**
     * soap方式(有1.1和1.2两个版本,jdk1.7以上才可以使用soap1.2)
     * @param number
     * @throws IOException
     * @throws HttpException
     */
    private void soap(String number) throws HttpException, IOException {
        HttpClient hc = new HttpClient();//浏览器对象
        PostMethod pm = new PostMethod("http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx");//post提交
        //指定传输格式为xml格式
        pm.setRequestHeader("Content-Type", "application/soap+xml;charset=utf-8");
        //传输xml
        pm.setRequestBody(new FileInputStream("C:/Users/Admin/Desktop/service.xml"));
        //发送post请求
        int code = hc.executeMethod(pm);
        System.out.println("状态码"+code);
        String result = pm.getResponseBodyAsString();
        System.out.println("结果"+result);
    }
    public static void main(String[] args) {
        TranslateClient tl = new TranslateClient();
        try {
            //tl.get("18819465153");
            //tl.post("18819465153");
            tl.soap("18819465153");
        } catch (HttpException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

输入xml。

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Body>
    <getMobileCodeInfo xmlns="http://WebXml.com.cn/">
      <mobileCode>18312345678</mobileCode>
      <userID></userID>
    </getMobileCodeInfo>
  </soap12:Body>
</soap12:Envelope>

还有一种利用命令行生成接口的方式:

使用wsimport:

每个ws都会有一个WSDL,WSDL即WebService Description Language – Web服务描述语言。它是通过XML形式说明服务在什么地方-地址。通过XML形式说明服务提供什么样的方法 – 如何调用。

目前只需要复制一下那个url即可,然后打开命令提示符窗口,随便进入一个目录下(该目录要保存等会生成的和ws相关的文件,自己事先建一个即可),运行 
wsimport http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?WSDL 
  就会生成相应的javabean,当然了,是.class文件,但是我们不想要class文件,我们想要java文件,所以可以使用如下命令: 
wsimport -s http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?WSDL 
  这样不仅生成了class文件,还生成了java文件,如果我们想要在固定的包下生成这些文件,等会方便直接拷贝到项目里,可以使用下面的命令: 
wsimport -s . -p ws.client.c http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?WSDL 
  这样就会在目录ws/client/c/下生成所需要的class和java代码,然后我们删掉class文件,直接拷贝ws目录到工程中即可。

时间: 2024-12-20 10:12:40

初探webService的相关文章

C# webservice初探

转载请注明出处Coder的不平庸:http://blog.csdn.net/pearyangyang/article/details/46348633 因为工作的终端曾经是直接对数据库进行操作,导致每次终端会卡死,严重影响业务进度.所以进行了技术调整,用webservice来作为数据对接的一个中间件,自己也部署了一下webservice环境和入门. 整体来说分为下面这几个步骤: 1.部署IIS环境 2.创建webservice 3.编写測试程序引用webservice 我们就開始一步一步来进行.

webService初探(简单小demo)

1.什么是webService? 1.1.先说好处: WebService是两个系统的远程调用,使两个系统进行数据交互,如应用: 天气预报服务.银行ATM取款.使用邮箱账号登录各网站等. WebService之间的调用是跨语言的调用.Java..Net.php,发送Http请求,使用的数据格式是XML格式. webxml.com.cn上面有一些免费的WebService服务,可以进去看看. 基础概念: (1)理解服务: 现在的应用程序变得越来越复杂,甚至只靠单一的应用程序无法完成全部的工作.更别

PHP webservice初探

背景:在最近的开发中,为了解决公司内部系统与外部系统的对接,开始接触到了webservice接口,外部公司提供接口供我们调用,已达到数据同步的目的,因此有必要普及一下web service的知识了! 什么是web service:web service是一个平台独立的,低耦合的,自包含的.基于可编程的web的应用程序,可使用开放的XML(标准通用标记御园下的一个子集)标准来描述.发布.发现.协调和配置这些应用程序,用于开发分布式的互操作的应用程序. webservice三要素:SOAP.WSDL

国外物联网平台初探(五):Exosite Murano

国外物联网平台初探(五)--Exosite Murano 马智 ? 定位 Murano是一个基于云的IoT软件平台,提供安全.可扩展的基础设施,支持端到端的生态系统,帮助客户安全.可扩展地开发.部署和管理应用.服务以及联网产品. ? 功能 Murano平台简化了整个IoT技术栈,可视为集成在一起的多个云软件层. Murano提供IoT基础设施.开发环境和功能集成,包括设备连接.产品管理.数据路由.服务集成(如data store/告警/第三方分析平台).应用开放API.用户认证/角色/权限和应用

构建安全的Xml Web Service系列之初探使用Soap头

原文:构建安全的Xml Web Service系列之初探使用Soap头 Xml Web Service 从诞生那天就说自己都么都么好,还津津乐道的说internet也会因此而进入一个新纪元,可5年多来,Xml Web Service并没有像当初宣扬的那样火起来,尽管在一些领域之内,也有人牛刀小试,但从整体而言,Service还并没有得到广泛的应用,原因有很多,有一些来源于目前各大厂商都坚持自己的service标准,不能形成统一,也有对现有的稳定系统不愿进行更改的原因,但还包括web servic

自定义及发布一个webservice服务

自定义及发布一个webservice服务    - 声明 某个业务服务为webservice服务       通过@webservice 注解来声明    - 发布webservice服务       Endpoint.publish()发布 (默认对public修饰的方法进行发布)    - 通过wsimport生成本地代理来访问自己发布的webservice       wsimport 1.发布自定义webservice phone.java package ws.myWebService

调用已发布的WebService

WebService服务演示 登录http://www.webxml.com.cn 单击手机查询服务 3.         选择要调用的方法 例如: getMobileCodeInfo. 4. 输入要查询的手机号单击”调用” 截图如下, 免费用户 UserID为null a)   可以看到返回如下结果: <?xml version="1.0" encoding="utf-8" ?> <string xmlns="http://WebXml

webservice实验一

实验目的:安装jdk1.6_21以后的版本,利用JAX-WS API自己发布webservice并调用,以及用wsimport生成webservice客户端代码调用一个免费的web服务(如webxml.com.cn上的获取手机归属地的服务). 一.webservice原理了解 webservice是一种通用的跨语言跨平台的数据交互方式,之所以能够做到这一点,是因为它的底层实现机制是依赖于HTTP协议以及XML格式这些开发的标准.webservice使用SOAP(simple object acc

C# 动态生成WebService,无需添加引用

C#项目调用WebService是很常见的现象,但一旦修改链接地址就需要重新更新引用很是麻烦,这里跟大家分享一个通过地址,无需添加引用动态生成Webservice的小方法 方法类: 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.ServiceModel; 6 using System.ServiceModel.Channels