web service系列二(几个广义的web service实现).md
来源:互联网 发布:原语在c语言 编辑:程序博客网 时间:2024/05/16 12:46
前言
关于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系列二(几个广义的web service实现).md
- web service系列一(什么是web service).md
- web service系列三(关于RPC).md
- axis2实现web service(二)
- axis2实现web service(二)
- Web Service基础(二)
- 分布式系统系列(二)---Web Service原理
- OSGI系列 Web-Service
- Web Service的几个很重要的概念
- Web Service的几个很重要的概念
- Web Service的几个很重要的概念
- web service 的简单实现
- Web Service笔记(二):利用CXF开发Web Service
- Web Service笔记(二):利用CXF开发Web Service
- 二、Web Service开发
- 二、Web Service开发
- Axis2 Web Service(二)
- Axis2 Web Service(二)
- 事务实现原理
- Poj 1787 Charlie's Change(多重背包 或者 记录的完全背包)
- 内存管理中各属性值的区别
- Android Studio 打包、生成jks密钥、签名Apk、多渠道打包
- 补间动画
- web service系列二(几个广义的web service实现).md
- Android SharePreference框架Favor详解
- centos6.5安装Mysql5.6版本
- 神经网络训练中的训练集、验证集以及测试集合
- 二叉树已知先序序列(后序序列)、中序序列求解后序序列(先序序列)
- 【Python】求数组(list)中最大的X个数,不递归,尽可能减少代码量
- win7系统怎么用笔记本做wifi热点
- c++11线程管理,RAII方式等待异常环境下线程结束
- matlab:创建cell结构体