web service系列二(几个广义的web service实现).md

原创 2015年11月21日 16:30:05

前言

关于web service的初步理解,我已经发表在《web service系列一(什么是web service).md》上了,感兴趣的可以自行查看,
本文主要是基于网易云课堂的《Web Service与CXF》,在学习的时候记录下自己的一些体会。
这里要实现的广义的web service,指基于socket,基于post,基于get的实现。与狭义的web service相比,这些广义的webservice存在许许多多的小问题,这也就是标准的狭义的web service需要存在的意义。

基于socket的

socket大家都懂,我也就不多啰嗦,直接上代码。

//server端的
public class SocketServer {
    public static void main(String[] args)throws Exception {
        //9999端口
        ServerSocket ss=new ServerSocket(9999);
        while(true){
            System.out.println("等待客户端请求...............");
            Socket socket=ss.accept();
            System.out.println("握手成功");
            //通过输入流获取数据
            InputStream input =socket.getInputStream();
            byte[]b=new byte[1024];
            int len=input.read(b);
            String data=new String(b,0,len);
            System.out.println("客户端数据为"+data);
            OutputStream output=socket.getOutputStream();
            output.write(data.toUpperCase().getBytes());
            output.close();
            input.close();
            socket.close();
        }
    }
//client端的
public class SocketClient {
    public static void main(String[] args) throws Exception{
        Scanner input=new Scanner(System.in);
        Socket sc=new Socket("127.0.0.1",9999);
        //获取数据流,发送数据
        System.out.println("请输入要转换的字母:");
        String initData=input.next();
        OutputStream out=sc.getOutputStream();
        out.write(initData.getBytes());
        System.out.println("等待服务器返回数据");
        InputStream in =sc.getInputStream();
        byte[]b =new byte[1024];
        int len =in.read(b);
        System.out.println("返回的结果是"+new String(b,0,len));
        out.close();
        in.close();
        sc.close();
    }
}

这就是个简单的socket通信过程,即时对java的不太了解的同学,也能对此看个九成懂。纯粹的socket通信,是后面一切的基础。不同的语言也是可以通过socket进行通信的,咋一看,还挺符合web service的需求的,但是仔细思考一下,这样却存在很多很多问题的。

  • socket不利于推广
    也许简单的两台机器交流,使用这种方法是没有太大问题的。但是如果对方是个分布式的服务(就像以前360手机助手的一个接口,就可能达数十台服务器),你面对的是一个基于集群的服务,而不是单台机器,这样ip+端口的访问时非常无力的。对于web service发布者而言,如何将自己的socket告诉别人,也是非常麻烦的,毕竟大部分机器都是处于内网的保护之下的。

  • 防火墙的问题
    对于socket而言,会开启大量的端口,和一般的木马什么的程序的行为比较相似,难于区分。而防火墙一般会对端口进行限制,从而保护内网机器的安全,所以纯粹的socket是不利于web service的运行。

  • http协议的问题
    一般应用层的服务都需要通过http协议。如果自己自建一个socket的话,那对于http协议的解析还要自己重新做,这样的话就比较浪费时间和精力。

  • 同步变化的维护
    即使双方定义好了格式及解析的细节,后面一旦出现了变化,双方都需要做大量的改动。可以和后文标准的web service进行比较,大家就能发现这种方法的弊端。

基于HTTP的(get和post)

这里我们就要通过 http://www.webxml.com.cn 来做一些接近于标准web service的工作。在那个网站的说明里,有一个手机号查询的web service,可以通过get、post以及soap实现对其的调用。对于get和post,这里我们就用的一个开源的开发工具包HttpClient。

【简介】HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。
【为什么需要HttpClient】原生态的Socket基于传输层,现在我们要访问的WebService是基于HTTP的属于应用层,所以我们的Socket通信要借助HttpClient发HTTP请求,这样格式才能匹配。

通过这种方法,不难看出可以弥补socket的一些缺陷。
来看看源码:

public static void getMethod() throws Exception {
        // 创建get对象,类似get请求
        GetMethod getMethod = new GetMethod(        "http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx/getMobileCodeInfo?mobileCode=1871097&userID=");
        // 发送get请求
        int code = http.executeMethod(getMethod);
        System.out.println("返回的消息码为:" + code);
        System.out.println("返回的消息为:" + getMethod.getResponseBodyAsString());
        getMethod.releaseConnection();
    }
public static void postMethod() throws Exception {
        // 创建post请求,类似Post请求
        PostMethod postMethod = new PostMethod(                "http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx/getMobileCodeInfo");
        // 设置请求的正文内容
        postMethod.setRequestBody("mobileCode=1871097&userID=");
        // 设置传送信息的格式
        postMethod.setRequestHeader("Content-Type",
                "application/x-www-form-urlencoded");
        // 发送post请求
        int code = http.executeMethod(postMethod);
        System.out.println("返回消息码为:" + code);
        System.out.println("返回的消息为:" +
        postMethod.getResponseBodyAsString());
        postMethod.releaseConnection();
    }

这样的话,会得到一个混杂着一些xml的数据,但是基本可以得到比较有效的数据。
这样的话仍然有一些问题,如果数据的参数过多的话,纯粹的POST和GET就无法有效的处理,所以后来标准的web server就利用xml等面向对象的封装,解决了这个问题(可以类比传统的面向对象的编程)。

欢迎大家到 http://blog.bear2.cn 讨论

版权声明:本文为博主原创文章,未经博主允许不得转载。

开发web service的接口实现方法

一、WebService的开发手段   使用Java开发WebService时可以使用以下两种开发手段     1、 使用JDK开发(1.6及以上版本)     2、使用CXF框架开...
  • wu_chengwei
  • wu_chengwei
  • 2017年02月24日 10:31
  • 2054

web service系列一(什么是web service).md

我与web service的结缘web serivce相对来说,已经不是一个非常火的概念,本身的许多技术虽然仍广泛运用,但是模糊化下的web serivce已经越来越多被api等新的术语所代替。 对...
  • u013128262
  • u013128262
  • 2015年11月19日 20:56
  • 361

myeclipse里web project和web service project的区别

在 myeclipse 中新建一个项目会出现这两个很相似的选项。 区别如下: 平时开发B/S的项目,都是web项目,很少用到web service。web service是另外一个概念,是基于...
  • tlycherry
  • tlycherry
  • 2013年04月20日 16:08
  • 2392

web service优缺点

与目前流行的多层开发架构(如J2EE)相比,采用Web Services技术来实现企业计算有什么优缺点? 优点: 一:数据交换 Web Service使数据交换更加方便,实现跨防火墙的通信。以一...
  • screensky
  • screensky
  • 2012年07月12日 14:12
  • 6813

一个电商项目的Web服务化改造

一个电商项目的Web服务化改造项目,早期是随便瞎做的,没啥架构,连基本的设计也没。有需求,实现需求,再反复修改。大致就是这么做的。最近,项目要重新架构,和某boss协商的结果是,采用阿里开源的dubb...
  • FansUnion
  • FansUnion
  • 2016年04月25日 17:58
  • 1956

Web Service 与SOA 关系区别

Web Service 与SOA 关系区别 引: SOA 不是Web服务 Web服务是实现SOA的方式之一。     对于面向同步和异步应用的,基于请求/响应模式的分布式计算来说,SOA是一场革命。一...
  • Fisher_n
  • Fisher_n
  • 2014年12月24日 10:36
  • 1190

Java 开发Web Service的几种方式

webservice的应用已经越来越广泛了,下面介绍几种在Java体系中开发webservice的方式,相当于做个记录。 1.Axis2 Axis是apache下一个开源的webservice开发...
  • guoweimelon
  • guoweimelon
  • 2016年03月02日 11:31
  • 864

webservice几个知识点

一. Webservice是什么?         1. 基于Web的服务:服务器端整出一些资源让客户端应用访问(获取数据) 2. 一个跨语言、跨平台的规范(抽象) 3. 多个跨平台、跨语言的...
  • u010741376
  • u010741376
  • 2015年08月31日 23:41
  • 599

RESTful Web Service 架构剖析

如今微服务和分布式架构变的越来越流行,而简单,可靠,高效,跨平台和跨语言的 Web Service 则是这类系统架构的基石。 RESTful Web Service 恰好满足这些特点,被越来越多的系...
  • liuwenbiao1203
  • liuwenbiao1203
  • 2016年08月29日 10:06
  • 925

myeclipse 中新建web project和web service project的区别

web          project    就是平时我们的网站开发,像ssh框架之类的。 web service  project    就是web服务 专门为服务器开发应用。就好像网站都有...
  • u010015108
  • u010015108
  • 2016年11月18日 11:08
  • 1180
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:web service系列二(几个广义的web service实现).md
举报原因:
原因补充:

(最多只允许输入30个字)