因为公司的项目远程调用采用的是hessian,故抽时间了解了下hessian,自己也写了一个应用实例,以便加深对hessian的理解。

Hessian是一个轻量级的remoting onhttp工具,使用简单的方法提供了RMI的功能。 相比WebService,Hessian更简单、快捷。采用的是二进制RPC协议,因为采用的是二进制协议,所以它很适合于发送二进制数据。

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

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

·包含Hessian的jar包

·设计一个接口,用来给客户端调用

·实现该接口的功能

·配置web.xml,配好相应的servlet

·对象必须实现Serializable 接口

·对于复杂对象可以使用Map的方法传递

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

·java客户端包含Hessian.jar的包。

·具有和服务器端结构一样的接口。包括命名空间都最好一样

·利用HessianProxyFactory调用远程接口。

以下是一个关于hessian应用的示例程序。

示例背景:

由于本人所在公司正在编码直播室方面的项目,故以下源码中用LiveRoom.java类为直播室的类。User.java类为用户类。直播室和用户之间为一对多的关系。即一个直播室里面有多个用户。本示例将实现对直播室的增删改查功能

我们先写服务端

服务端,即提供服务的一端(废话,呵呵),需要定义接口,并提供接口实现。

首先,定义两个类LiveRoom和User,并且两个类都要实现Serializable 接口

package org.study.hessian.domain;

import java.io.Serializable;

import java.util.ArrayList;

import java.util.List;

public class LiveRoom implements Serializable,Comparable<LiveRoom>{

private static final long serialVersionUID = -3219121209937741843L;

private int roomId;

private String roomName;

public List<User> users = new ArrayList<User>();

public LiveRoom(int roomId, String roomName) {

super();

this.roomId = roomId;

this.roomName = roomName;

}

public LiveRoom() {

super();

}

public int getRoomId() {

return roomId;

}

public void setRoomId(int roomId) {

this.roomId = roomId;

}

public String getRoomName() {

return roomName;

}

public void setRoomName(String roomName) {

this.roomName = roomName;

}

public int compareTo(LiveRoom o) {

if(this.getRoomId() > o.getRoomId()){

return 1;

}

else if(this.getRoomId() < o.getRoomId()){

return -1;

}

else

{

return 0;

}

}

}

package org.study.hessian.domain;

import java.io.Serializable;

import java.util.Date;

public class User implements Serializable{

private int userId;

private String userName;

private Date birth;

public int getUserId() {

return userId;

}

public void setUserId(int userId) {

this.userId = userId;

}

public String getUserName() {

return userName;

}

public void setUserName(String userName) {

this.userName = userName;

}

public Date getBirth() {

return birth;

}

public void setBirth(Date birth) {

this.birth = birth;

}

}

然后定义接口

package org.study.hessian.service;

import java.util.List;

import org.study.hessian.domain.LiveRoom;

public interface LiveRoomService {

public abstract void addRoom(LiveRoom room);

public abstract void delRoom(int roomId);

public abstract void updateRoom(LiveRoom room);

public abstract LiveRoom getRoomById(int roomId);

public abstract List<LiveRoom> getAllRoom();

}

接口的实现

package org.study.hessian.service.impl;

import java.util.ArrayList;

import java.util.Collection;

import java.util.Collections;

import java.util.HashMap;

import java.util.Iterator;

import java.util.List;

import java.util.Map;

import org.study.hessian.domain.LiveRoom;

import org.study.hessian.service.LiveRoomService;

public class LiveRoomServiceImpl implements LiveRoomService {

public Map<Integer, LiveRoom> roomMap = new HashMap<Integer, LiveRoom>();

public void addRoom(LiveRoom room) {

roomMap.put(room.getRoomId(), room);

}

public void delRoom(int roomId) {

roomMap.remove(roomId);

}

public List<LiveRoom> getAllRoom() {

List<LiveRoom> list = new ArrayList<LiveRoom>();

Collection<LiveRoom> coll = roomMap.values();

Iterator<LiveRoom> it = coll.iterator();

while(it.hasNext()){

LiveRoom room = it.next();

list.add(room);

}

Collections.sort(list);

return list;

}

public LiveRoom getRoomById(int roomId) {

return roomMap.get(roomId);

}

public void updateRoom(LiveRoom room) {

roomMap.remove(room.getRoomId());

roomMap.put(room.getRoomId(), room);

}

}

配置web.xml,配好相应的servlet

<?xml version="1.0" encoding="UTF-8"?>

<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee

http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

<welcome-file-list>

<welcome-file>index.jsp</welcome-file>

</welcome-file-list>

<servlet>

<servlet-name>liveRoom</servlet-name>

<servlet-class>

com.caucho.hessian.server.HessianServlet

</servlet-class>

<init-param>

<!-- home-class也可以写为service-class -->

<param-name>home-class</param-name>

<!-- 服务器对接口的现实,供客户端调用 -->

<param-value>

org.study.hessian.service.impl.LiveRoomServiceImpl

</param-value>

</init-param>

<init-param>

<!--home-api也可以写为api-class  -->

<param-name>home-api</param-name>

<!-- 客户端接口 -->

<param-value>org.study.hessian.service.LiveRoomService</param-value>

</init-param>

</servlet>

<servlet-mapping>

<servlet-name>liveRoom</servlet-name>

<url-pattern>/liveRoom</url-pattern>

</servlet-mapping>

</web-app>

至此,服务端的代码就写完了。

接着,我们写客户端

注:客户端需要服务端定义的两个类和定义的接口(不需要接口的实现)

客户端的调用代码如下:

package org.study.hessian;

import java.net.MalformedURLException;

import java.util.ArrayList;

import java.util.Date;

import java.util.List;

import org.study.hessian.api.LiveRoomService;

import org.study.hessian.domain.LiveRoom;

import org.study.hessian.domain.User;

import org.study.hessian.utils.PropertyFileUtil;

import com.caucho.hessian.client.HessianProxyFactory;

public class Test {

public static void main(String[] args) throws MalformedURLException,

ClassNotFoundException {

// 远程调用地址

String url="http://localhost:8080/HessianServer/liveRoom";

System.out.println(url);

HessianProxyFactory factory = new HessianProxyFactory();

LiveRoomService liveRoomService = (LiveRoomService) factory.create(

LiveRoomService.class, url);

for (int i = 1; i < 10; i++) {

LiveRoom room = new LiveRoom();

room.setRoomId(i);

room.setRoomName("liveRoom" + i);

List<User> list = new ArrayList<User>();

for (int j = 1; j < 5; j++) {

User user = new User();

user.setUserId(j);

user.setUserName("xiongyuewen" + j);

user.setBirth(new Date());

list.add(user);

}

room.users = list;

liveRoomService.addRoom(room);

}

liveRoomService.delRoom(3);

LiveRoom room = new LiveRoom();

room.setRoomId(4);

room.setRoomName("wanglili");

room.users = null;

liveRoomService.updateRoom(room);

List<LiveRoom> listRooms = liveRoomService.getAllRoom();

if (listRooms == null) {

throw new RuntimeException("listRooms is null");

}

for (LiveRoom lr : listRooms) {

System.out.println(lr.getRoomName());

List<User> users = lr.users;

if (users == null) {

continue;

}

for (User user : users) {

System.out.println(user.getUserName() + " " + user.getBirth());

}

}

}

}

hessian应用示例的更多相关文章

  1. Hessian探究(一)Hessian入门示例

    一.hessian的maven信息: [html] view plain copy print? <dependency> <groupId>com.caucho</gr ...

  2. hessian原理解析一(客户端分析)

    hessian 是一款开源的二进制远程通讯协议,使用简单方法提供了RMI功能,主要用于面向对象的消息通信. 优点:跨平台.多语言支持.使用简单 缺点:传递复杂对象性能会下降,不适合安全性高的应用 一 ...

  3. Hessian探究(一)Hessian与springMVC结合

    上一篇博客Hessian探究(一)Hessian入门示例我们初步简单的介绍了一下Hessian的使用入门示例,我们是通过Servlet来暴露Hessian的对外服务的,接下来我们介绍一下通过Sprin ...

  4. Hessian探究(一)Hessian与Spring结合

    上一篇博客Hessian探究(一)Hessian入门示例我们初步简单的介绍了一下Hessian的使用入门示例,由于Spring现在使用的实在是太广泛了,接下来我们介绍一下Hessian和Spring一 ...

  5. Ruby入门--Linux/Windows下的安装、代码开发及Rails实战

    Ruby入门--Linux/Windows下的安装.代码开发及Rails实战 http://www.linuxidc.com/Linux/2014-04/100242.htm Ubuntu 13.04 ...

  6. Hessian示例:Java和C#通信

    一个简单的利用Hessian在Java和C#之间通信的例子,服务端为Java,客户端为C#. 资源下载 先要准备好C#和Java的第三方类库:http://hessian.caucho.com/ Hs ...

  7. Hessian服务端和客户端示例

    一.服务端 1.创建web项目,建立客户端调用的hessian接口和实现类. 接口: package com.ymx.hessian.service; import com.ymx.hessian.s ...

  8. 【RPC】使用Hessian构建RPC的简单示例

    服务接口和实现 public interface HelloService { // 服务方法 String sayHello(String name); } public class HelloSe ...

  9. Hessian 接口使用示例总结

    一.使用hessian接口准备 首先,hessian接口的使用,必须要准备hessian接口的jar包,本文使用的jar包如下:hessian-4.0.7.jar; Hessian接口的使用一般是在两 ...

随机推荐

  1. RL_RTX函数

    1 延时:os_itv_set(usFrequency) //设置延时周期,配合os_itv_wait使用:os_itv_wait() 是绝对延迟是包含调用前的时间, os_dly_wait() 是相 ...

  2. (转)Mysql数据库之Binlog日志使用总结CentOS 7.x设置自定义开机启动,添加自定义系统服务

    Centos 系统服务脚本目录: /usr/lib/systemd/ 有系统(system)和用户(user)之分, 如需要开机没有登陆情况下就能运行的程序,存在系统服务(system)里,即: li ...

  3. 使用OAuth保护REST API并使用简单的Angular客户端

    1.概述 在本教程中,我们将使用OAuth保护REST API并从简单的Angular客户端使用它. 我们要构建的应用程序将包含四个独立的模块: 授权服务器 资源服务器 UI implicit - 使 ...

  4. 对jvm虚拟机 内存溢出的思考

    java内存溢出:当新产生对象时,新生代空间不够,导致无法申请到足够的空间,报内存溢出 内存泄漏:一些静态集合,静态常量没有被gc清理,越来越多,占用内存,最后导致无法申请到新的空间

  5. nio aio netty区别

    传统io就是bio     同步阻塞         但可以采用伪同步 nio  jdk1.7以前     同步非阻塞io     1.7以后     同步异步非阻塞                  ...

  6. 给Eclipse设置android的SDK位置时,出现这个:This Android SDK requires Andr...ate ADT to the latest

    这样的问题很好解决,一个升级ADT到指定版本或以上,另一个简单的办法是调低SDK版本 找到android-sdk-windows\tools\lib下的plugin.prop文件修改其中的版本号,改为 ...

  7. 4.词法结构-JavaScript权威指南笔记

    今天是第二章.所谓词法结构(lexical structure),就是写代码中最基本的东西,变量命名,注释,语句分隔等,这是抄书抄的... 1.字符集,必须是Unicode,反正Unicode是ASC ...

  8. IOC的使用

    1.概要: 在spring中,都是使用反射机制创建对象,将创建对象的权利交给spring容器,就是控制反转(ioc) 对象创建方式 有参构造 无参构造 工厂模式(静态,非静态) 2.创建IDEA控制台 ...

  9. 初识RatingBar

    RatingBar,SeekBar和ProgressBar的子类 <RatingBar android:id="@+id/ratingBar2" android:layout ...

  10. python读xml文件

    # -*- coding:utf-8 -*- import jsonimport requestsimport os curpath=os.path.dirname(os.path.realpath( ...