zoukankan      html  css  js  c++  java
  • Hessian学习(转加修改)

    一:远程通信协议基本原理

    网络协议要做的事:基于传输协议和网络IO,将流从一台计算机传输到另一台计算机

    传输协议一般有: http 、 tcp 、 udp,这些都是基于 Socket 概念上为某类应用场景而扩展出的传输协议

    网络IO一般有:bio 、 nio 、 aio 三种方式

    二:应用级协议:RPC(或者叫Binary RPC)

    它以标准的二进制格式来定义请求的信息 ( 请求的对象、方法、参数等 ) ,这样的好处是什么呢,就是在跨语言通讯的时候也可以使用。

    RPC 协议的一次远程通信过程:

     总结一下:

      1 、传输的标准格式是标准格式的二进制文件。

      2 、怎么样将请求转化为传输的流?将二进制格式文件转化为流。

      3 、怎么接收和处理流?通过监听的端口获取到请求的流,转化为二进制文件,根据协议获取请求的信息,进行处理并将结果写入 XML 中返回。

      4 、传输协议是?http

    三、Hessian介绍

    Hessian是一个轻量级的remoting on http工具,采用的是Binary RPC协议,所以它很适合于发送二进制数据,同时又具有防火墙穿透能力。Hessian一般是通过Web应用来提供服务,因此非常类似于平时我们用的 WebService。只是它不使用SOAP协议,但相比webservice而言更简单、快捷。

    Hessian官网:http://hessian.caucho.com/

    Hessian 可通过Servlet提供远程服务,需要将匹配某个模式的请求映射到Hessian服务。也可Spring框架整合,通过它的 DispatcherServlet可以完成该功能,DispatcherServlet可将匹配模式的请求转发到Hessian服务。Hessian的server端提供一个servlet基类, 用来处理发送的请求,而Hessian的这个远程过程调用,完全使用动态代理来实现的,,建议采用面向接口编程,Hessian服务通过接口暴露。

    Hessian处理过程示意图:客户端——>序列化写到输出流——>远程方法(服务器端)——>序列化写到输出流 ——>客户端读取输入流——>输出结果(此处流程前提是将client与server分为两个独立的应用)

    Hessian入门范例

    4.1下载Hessian

      去Hessian官网:http://hessian.caucho.com/下载最新的Hessian包,如下图所示:

    4.2、搭建Hessian测试服务端web项目

      新建一个名为HessianServer的web project。将hessian-4.0.51.jar放入WEB-INF/lib文件夹中,如下图所示:

    在进行基于Hessian的项目开发时,应当注意以下几点:

     JAVA服务器端必须具备以下几点:

    1. 包含Hessian的jar包。
    2. 设计一个接口,用来给客户端调用。
    3. 实现该接口的功能。
    4. 配置web.xml,配好相应的servlet。
    5. 对象必须实现Serializable 接口。
    6. 对于复杂对像可以使用Map的方法传递。

      客户端必须具备以下几点:

    1. java客户端包含Hessian.jar的包。
    2. 具有和服务器端结构一样的接口。
    3. 利用HessianProxyFactory调用远程接口。

    4.3、设计一个提供服务接口来给客户端调用

    IService接口的代码如下:

    package gacl.hessian.service; import gacl.hessian.entity.User; public interface IService { public User getUser(); }

    实体类代码如下:

    复制代码
    package gacl.hessian.entity;
    
    import java.io.Serializable;
    /*
     * 实现Serializable接口,是为了保证在网络中传输。
     */
    public class User implements Serializable {
        
        private static final long serialVersionUID = 1692800630322115854L;
      
        private String name;
    
        public User(String name) {
            super();
            this.name = name;
        }
    
        public User() {
            super();
            // TODO Auto-generated constructor stub
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
        
    
    }
    复制代码

    接口实现类代码如下:

    复制代码
    package gacl.hessian.service.Impl;
    
    import gacl.hessian.entity.User;
    import gacl.hessian.service.IService;
    
    public class ServiceImpl implements IService {
    
        @Override
        public User getUser() {
            // TODO Auto-generated method stub
            return new User("zhangyi");
        }
    
    }
    复制代码

    web.xml配置如下:

    复制代码
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
      <display-name>hessian</display-name>
      <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
      </welcome-file-list>
      <servlet>
          <!--配置 HessianServlet,Servlet的名字随便配置,例如这里配置成ServiceServlet  -->
          <servlet-name>ServiceServlet</servlet-name>
          <servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class>
          <!-- 配置接口的具体实现类 -->
          <init-param>
              <param-name>service-class</param-name>
              <param-value>gacl.hessian.service.Impl.ServiceImpl</param-value>
          </init-param>
          </servlet>
           <!-- 映射 HessianServlet的访问URL地址-->
           <servlet-mapping>
               <servlet-name>ServiceServlet</servlet-name>
               <url-pattern>/ServiceServlet</url-pattern>
           </servlet-mapping>
          
          
     
    </web-app>
    复制代码

    到此,Hessian的服务端编写就算是完成了。

      配置完成之后,启动项目,在地址栏输入:http://localhost:端口号/项目名/ServiceServlet,如果显示结果如下,说明配置和接口编写正确:

    4.6、编写Hessian的测试客户端

      新建一个HessianTestClient的普通Java项目作为测试客户端,需引入上述的hessian-4.0.37.jar,还需要服务端导出IService和User两个类的jar,放入lib。或创建两个一摸一样的类,这里是采用将服务端的IService和User两个类打包成jar包提供给客户端进行调用,打成Jar包的过程如下图所示:

    选中要打包的类

    这样就将IService类和User类打包成了一个Hessian_Common.jar包,如下图所示:

     新建客户端HessianTestClient应用如下:

    HessianTestClient项目引入上述的hessian-4.0.51.jar和IService和User两个类的jar,编写HessianClient客户端,HessianClient类的代码如下所示:

    复制代码
    package hessian.test.client;
    
    import java.net.MalformedURLException;
    
    
    import gacl.hessian.service.IService;
    
    import com.caucho.hessian.client.HessianProxyFactory;
    
    /**
     * <p>ClassName: HessianClient<p>
     * <p>Description: 调用Hessian的客户端<p>
     * @author xudp
     * @version 1.0 V
     * @createTime  下午07:05:42
     */
    public class HessianClient {
    
        public static void main(String[] args) throws MalformedURLException {
          System.out.println("1111");
            
            /* 
                <servlet>
                    <!-- 配置 HessianServlet,Servlet的名字随便配置,例如这里配置成ServiceServlet-->
                    <servlet-name>ServiceServlet</servlet-name>
                    <servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class>
                    
                    <!-- 配置接口的具体实现类 -->
                    <init-param>
                        <param-name>service-class</param-name>
                        <param-value>gacl.hessian.service.impl.ServiceImpl</param-value>
                    </init-param>
                </servlet>
                <!-- 映射 HessianServlet的访问URL地址-->
                <servlet-mapping>
                    <servlet-name>ServiceServlet</servlet-name>
                    <url-pattern>/ServiceServlet</url-pattern>
                </servlet-mapping>
             */
            //在服务器端的web.xml文件中配置的HessianServlet映射的访问URL地址
            String url = "http://10.211.**.**:8088/HessianServer/ServiceServlet";
            HessianProxyFactory factory = new HessianProxyFactory();
            IService service = (IService) factory.create(IService.class, url);//创建IService接口的实例对象
            gacl.hessian.entity.User user = service.getUser();//调用Hessian服务器端的ServiceImpl类中的getUser方法来获取一个User对象
            System.out.println(user.getName());
        }
    }
    复制代码

    将HessianServer项目部署到tomcat服务器,启动另一台tomcat服务器,用来运行HessianClient客户端,(否则端口会被占用)运行结果如下:

    从运行结果中可以看到,在HessianClient客户端中已经成功获取到远程的HessianServer服务器端传输过来的User对象,然后打印出User对象的名字。

    以上就是Hessian的一个入门级别的案例!

    原文链接:https://www.cnblogs.com/xdp-gacl/p/3897534.html

  • 相关阅读:
    摩根斯坦利面试
    Interview Preparation IV
    Interview Preparation III
    Interview Preparation II
    Interview Preparation I
    ASCII Characters
    Java Serialization
    贝莱德伦敦分部面试
    SVG基本知识
    前端知识整理(四)【HTTP相关】
  • 原文地址:https://www.cnblogs.com/1987721594zy/p/9150330.html
Copyright © 2011-2022 走看看