hessian应用示例
因为公司的项目远程调用采用的是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应用示例的更多相关文章
- Hessian探究(一)Hessian入门示例
一.hessian的maven信息: [html] view plain copy print? <dependency> <groupId>com.caucho</gr ...
- hessian原理解析一(客户端分析)
hessian 是一款开源的二进制远程通讯协议,使用简单方法提供了RMI功能,主要用于面向对象的消息通信. 优点:跨平台.多语言支持.使用简单 缺点:传递复杂对象性能会下降,不适合安全性高的应用 一 ...
- Hessian探究(一)Hessian与springMVC结合
上一篇博客Hessian探究(一)Hessian入门示例我们初步简单的介绍了一下Hessian的使用入门示例,我们是通过Servlet来暴露Hessian的对外服务的,接下来我们介绍一下通过Sprin ...
- Hessian探究(一)Hessian与Spring结合
上一篇博客Hessian探究(一)Hessian入门示例我们初步简单的介绍了一下Hessian的使用入门示例,由于Spring现在使用的实在是太广泛了,接下来我们介绍一下Hessian和Spring一 ...
- Ruby入门--Linux/Windows下的安装、代码开发及Rails实战
Ruby入门--Linux/Windows下的安装.代码开发及Rails实战 http://www.linuxidc.com/Linux/2014-04/100242.htm Ubuntu 13.04 ...
- Hessian示例:Java和C#通信
一个简单的利用Hessian在Java和C#之间通信的例子,服务端为Java,客户端为C#. 资源下载 先要准备好C#和Java的第三方类库:http://hessian.caucho.com/ Hs ...
- Hessian服务端和客户端示例
一.服务端 1.创建web项目,建立客户端调用的hessian接口和实现类. 接口: package com.ymx.hessian.service; import com.ymx.hessian.s ...
- 【RPC】使用Hessian构建RPC的简单示例
服务接口和实现 public interface HelloService { // 服务方法 String sayHello(String name); } public class HelloSe ...
- Hessian 接口使用示例总结
一.使用hessian接口准备 首先,hessian接口的使用,必须要准备hessian接口的jar包,本文使用的jar包如下:hessian-4.0.7.jar; Hessian接口的使用一般是在两 ...
随机推荐
- 服务器配置,负载均衡时需配置MachineKey
服务器配置,负载均衡时需配置MachineKey https://blog.csdn.net/liuqiao0327/article/details/54018922 Asp.Net应用程序中为什么要 ...
- Polly+AspectCore实现熔断与降级机制
Polly+AspectCore实现熔断与降级机制 https://www.cnblogs.com/edisonchou/p/9159644.html 一.熔断.降级与AOP 1.1 啥是熔断? 在广 ...
- 简易的开发框架(微服务) Asp.Net Core 2.0
Asp.Net Core 2.0 + Mysql Orm + Ioc + Redis + AOP + RabbitMQ + Etcd + Autofac + Swagger 基础框架: https ...
- js动态更换img的src问题
在本地开发测试过程中,通过js动态更换img的src没有问题,图片正常切换,但是放在服务器上后测试发现,图片不显示,解决方法为:在对应onclick事件执行切换图片的js函数后加上一个return f ...
- canvas背景效果
canvas背景效果: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> & ...
- 移动端的300ms延迟和点击穿透
移动端300ms延迟:假定这么一个场景.用户在 浏览器里边点击了一个链接.由于用户可以进行双击缩放或者双击滚动的操作,当用户一次点击屏幕之后,浏览器并不能立刻判断用户是确实要打开这个链接,还是想要进行 ...
- Android 开发干货,键盘状态
地址:http://www.imooc.com/article/4711 [A]stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置 [B]stateU ...
- GitHub 开启 Two-factor authentication,如何在命令行下更新和上传代码
最近在使用GitHub管理代码,在git命令行管理代码时候遇到一些问题. 如果开起了二次验证(Two-factor authentication两个要素认证),命令行会一直提示输入用户名和密码.查找了 ...
- npm使用快速的安装源(nrm)
安装 npm install nrm --global 使用 nrm ls 切换安装源 nrm use taobao 测速 nrm test npm 参考地址:http://codingdict.co ...
- 64位Windows系统下32位应用程序连接MySql
1.首先得安装“Connector/ODBC”,就是Mysql的ODBC驱动,这个是与应用程序相关的,而不是与操作系统相关的,也就是说,不管你的系统是x64还是x86,只要你的应用程序是x86的那么, ...