欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Hessian学习笔记之HessianRPC

程序员文章站 2022-07-13 12:16:52
...

一、总述

       在Hessian学习笔记之上传文件这一篇中,通过一个实例讲解了如何通过Hessian实现上传文件。Hessian最主要的特征之一就是远程过程调用(Remote Procedure Call,RPC)。下面通过一个简单的实例说明。

 

二、实例展示

     1、环境搭建

          开发工具:eclipse + tomcat。

          服务端:JavaWeb工程。例如,实例中本人创建的JavaDemo工程。

          客户端:Java工程。例如,实例中本人创建的HessianClient工程。

     

     2、代码实现

           a.实体类:        

import java.io.Serializable;
import java.util.Date;

public class Person implements Serializable {
	private static final long serialVersionUID = 8268991521882061845L;
	
	private int id;
	private String name ;
	private Long phone ;
	private boolean gender;
	private double height;
	private float weight;
	private String[] address;
	private Date birthday;
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Long getPhone() {
		return phone;
	}
	public void setPhone(Long phone) {
		this.phone = phone;
	}
	public boolean isGender() {
		return gender;
	}
	public void setGender(boolean gender) {
		this.gender = gender;
	}
	public double getHeight() {
		return height;
	}
	public void setHeight(double height) {
		this.height = height;
	}
	public float getWeight() {
		return weight;
	}
	public void setWeight(float weight) {
		this.weight = weight;
	}
	public String[] getAddress() {
		return address;
	}
	public void setAddress(String[] address) {
		this.address = address;
	}
	public Date getBirthday() {
		return birthday;
	}
	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}
	
	public String toString(){
		return "name:" + this.name + " phone:" + this.phone;
	}
}

 

 

           b.服务端HessianServer接口           

import java.io.InputStream;
import java.util.List;

import com.zh.hessian.entry.Person;

public interface HessianServer {
   public String say();
   public String say(String str);
   public List<Person> getPerson();
   public Person getPersonById(int id);
   public boolean upload(String filename,InputStream data);
   public byte[] download(String filename);
}

          

 

         c.服务端HessianServer接口实现         

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Random;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;

import com.zh.hessian.entry.Person;

public class HessianServerImpl implements HessianServer {
    //上传或下载文件的地址
	private static String file_Path = "D:/tools/LearningByMyself/hessian/temp/";
	
	private static Person[] persons = new Person[5];
    static {
    	Random random = new Random();
    	for(int i=0;i<persons.length;i++){
    		persons[i] = new Person();
    		persons[i].setId(i);
    		persons[i].setGender(random.nextBoolean());
    		persons[i].setName("name-" + i);
    		persons[i].setPhone(random.nextLong());
    		persons[i].setHeight(random.nextDouble());
    		persons[i].setWeight(random.nextFloat());
    		persons[i].setAddress(new String[]{"Address" + random.nextInt(),"Address" + random.nextInt()});
    		
    		Calendar calendar = Calendar.getInstance();
    		calendar.set(Calendar.DATE, i+1);
    		persons[i].setBirthday(calendar.getTime());
    	}
    }
    	@Override
	public String say() {
		return "Hello HessianRPC " + new Date().toString();
	}

	@Override
	public String say(String str) {
		return "Welcome" + str;
	}

	@Override
	public List<Person> getPerson() {
		return Arrays.asList(persons);
	}

	@Override
	public Person getPersonById(int id) {
		for(Person person : persons){
			if(person.getId() == id){
				return person ;
			}
		}
		return null;
	}
	@Override
	public boolean upload(String filename, InputStream data) {
		List<String> temp;
        try {
            temp = IOUtils.readLines(data);
            String filePath = file_Path + filename;
            FileUtils.writeLines(new File(filePath), temp);
            System.out.println("Upload file to " + filePath);
            return true;
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
	}

	@Override
	public byte[] download(String filename) {
		String filePath = file_Path + filename;
        InputStream data = null;
        try {
            data = new FileInputStream(filePath);
            int size = data.available();
            byte[] buffer = new byte[size];
            IOUtils.read(data, buffer);
            return buffer;
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            return null;
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        } finally {
            IOUtils.closeQuietly(data);
        }
    }
}

          

 

         d.web.xml配置      

<servlet>
     <!-- RPC HessianServlet -->
     <servlet-name>hessianRPC</servlet-name>
     <servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class>
     
     <!-- 服务端配置 -->
     <init-param>
          <param-name>service-class</param-name>
          <param-value>com.zh.hessian.server.HessianServerImpl</param-value>
     </init-param>
     
     <!-- 客户端配置(可选) -->
     <init-param>
          <param-name>api-class</param-name>
          <param-value>com.zh.hessian.server.HessianServer</param-value>
     </init-param>
  </servlet>
  <servlet-mapping>
     <servlet-name>hessianRPC</servlet-name>
     <url-pattern>/hessianRPC</url-pattern>
  </servlet-mapping>

          

 

         e.检验服务端

         启动Tomcat后,在浏览器中输入:http://localhost:8080/JavaDemo/hessianRPC,回车后,出现如下信息:

  Hessian Requires POST

则服务端可用。

         

         f.文件打包:

         将服务端的HessianServer文件和实体类Person打成Jar包,添加到客户端的工程。例如,实例中打成的两个jar包:HessianRPC.jar和Person.jar。

 

         g.客户端实现     

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

import org.apache.commons.io.IOUtils;

import com.caucho.hessian.client.HessianProxyFactory;
import com.zh.hessian.entry.Person;
import com.zh.hessian.server.HessianServer;

public class HessianClient {
    //Hessian RPC远程服务url
	private static final String url = "http://127.0.0.1:8080/JavaDemo/hessianRPC";
		
    public static void main(String[] args) throws Exception{
    	//创建HessianProxyFactory实例
    	HessianProxyFactory factory = new HessianProxyFactory();
    	
        //开启方法重载
        factory.setOverloadEnabled(true); 
        
        //获得Hessian服务的远程引用
        HessianServer hessianServer = (HessianServer)factory.create(HessianServer.class, url);
 
        //调用方法
        System.out.println("call say():" + hessianServer.say());
        System.out.println("call say(\"Tom\"):" + hessianServer.say("Tom"));
        System.out.println("call getPerson():");
 
        //调用方法获取集合对象
        List<Person> persons = hessianServer.getPerson();
        if (null != persons && persons.size() > 0) {
            for (Person p : persons) {
                System.out.println(p.toString());
            }
        } else {
            System.out.println("No person.");
        }
 
        //通过参数调用方法获取对象
        int id = 2;
        System.out.println(String.format("call getPersonById(%d)", id));
        Person person = hessianServer.getPersonById(id);
        if (null != person) {
            System.out.println(person.toString());
        } else {
            System.out.println("Id is " + id + " person not exist.");
        }
        
        uploadFile(hessianServer);
        downloadFile(hessianServer);      
    }
    
    /**
     * 上传文件
     * @param hessianServer
     */
    public static void uploadFile(HessianServer hessianServer){
    	String file = "D:/papers/work_opt.txt";//需要上传的文件
        String file_path= "D:/tools/LearningByMyself/hessian/temp";//上传文件到服务器的路径
        InputStream data = null;
        try {
            data = new BufferedInputStream(new FileInputStream(file));
            if (hessianServer.upload("work_opt.txt", data)) {
                System.out.println("Upload file " + file_path + " succeed.");
            } else {
                System.out.println("Upload file " + file_path + " failed.");
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {
            IOUtils.closeQuietly(data);
        }
    }
    
    /**
     * 下载文件
     * @param hessianServer
     */
    public static void downloadFile(HessianServer hessianServer){
    	byte[] temp = null ;
        String file_name = "work_opt.txt" ;
        String download_path = "D:/tools/LearningByMyself/hessian/temp_write/";//文件下载后存放的路径
        try { 
            temp = hessianServer.download(file_name);
            if (null != temp) {
                FileWriter output = new FileWriter(download_path + file_name);
                IOUtils.write(temp, output, "UTF-8");
                System.out.println("Download file " + download_path + " succeed.");
                output.close();
            } else {
                System.out.println("Download file " + download_path + " failed.");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 

三、测试结果

    call say():Hello HessianRPC Wed Jul 15 10:50:09 CST 2015

    call say("Tom"):WelcomeTom

    call getPerson():

    name:name-0 phone:838556501517807978

    name:name-1 phone:284031862309934267

    name:name-2 phone:-1412022783575136070

    name:name-3 phone:-6202617782412451628

    name:name-4 phone:6912293883557709050

    call getPersonById(2)

    name:name-2 phone:-1412022783575136070

    Upload file D:/tools/LearningByMyself/hessian/temp succeed.

    Download file D:/tools/LearningByMyself/hessian/temp_write/ succeed.

    

    最后在对应的路径下找到上传和下载的文件。例如,实例中的work_opt.txt文件,上传文件:D:\tools\LearningByMyself\hessian\temp,下载文件:D:\tools\LearningByMyself\hessian\temp_write。