个人博客: 戳我,戳我

前言

由于工作的原因,接触到了hessain,项目需要做hessain和xml之间的报文转换。但是对于hessian是个什么东西一头雾水。于是接下来的时间了解了hessain协议的序列化规则以及hessian协议进行通信的方式。这篇文章是在完成了这个模块之后很长一段时间(大概3个月)才记录的。一来这个时候没什么事,二来当时就一直打算记录下学习的过程,后来搁置了。故本文对hessain协议做一个简单介绍,然后搭建了一个Java版的hessian客户端和服务端,实现了hessian通信。

什么是Hessian

什么是rpc?

RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。RMI是J2EE中标准的RPC服务,RPC的完美封装是的将业务逻辑可以进行分布式部署,将运算密集型的工作进行分流(但请求还是同步的),在使用过程中间封装起实现可以实现在客户端调用的时候完全透明(需要在RMI客户端调用方式进行封装)。

什么是hessian?

Hessian是一个轻量级的,自定义描述的二进制RPC协议。Hessian主要用作面向对象的消息通信。

hessian序列化规则

hessian序列化方式目前有两个版本1.0和2.0,具体可以查看官网http://hessian.caucho.com/doc/hessian-serialization.html。另外我在我的七牛空间上传了hessian协议2.0中文版,有需要的话可以下载,防止官网全英文看不懂。另外hessian官网上提供了各种版本的hessian协议的实现,包括java,c++,c#,Python,.NET,Ruby等,上面其实有比较详细的demo。可以参考,当时我也是参考过的。

Hessian通信案列(java)

环境准备

Eclipse && Tomcat.

资源下载

下载java版的hessian类库: hessian-4.0.37.jar

hessian 服务端

  1. Eclipse中新建Dynamic Web Project

    此处可以看到需要选择Target runtime,需要首先安装Tomcat。

  2. 导入下载的hessian-4.0-37.jar,右键build path->Add to Build path
    导入完成如图:

  3. 开发步骤

    hessian服务端的开发涉及到3个部分。定义接口&&接口实现&&web.xml

    • 定义接口

新建IBasic.java,随便命名。

package test;public interface IBasic {
public String hello();
}

此处做演示,只定义了一个最简单的hello函数,实际情况可以在此文件中增加你的接口函数。接口函数就是服务端暴露出来的服务,可以为客户服务的实际内容。故此接口文件也需要在客户端的开发中用到。

  • 接口实现

新建BasicService.java,随便命名。

package test;public class BasicService implements IBasic {private String hello= "Hello, world,my name is nick!";   public String hello() {return hello;
}
}

此文件就是接口函数的具体实现,此处只是针对在IBasic.java中定义好的接口函数。对于小白,简单来说,就是服务端提供了一些服务,或者说暴露了一些服务,也就是接口函数,这些服务供客户端远程调用,就像客户端在本地调用一样,只不过服务端跟客户端的通信采用了一些二进制协议。

  • web.xml
    服务端实现了上述两个文件,基本就算完成了,不过如果需要发布到tomcat运行,还需要在web.xml配置Servlet.

web.xml:

<?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>ServerMachine</servlet-name>  <servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class>  <init-param>  <param-name>home-class</param-name>  <param-value>test.BasicService</param-value>  </init-param>  <init-param>  <param-name>home-api</param-name>  <param-value>test.IBasic</param-value>  </init-param>  </servlet>  <servlet-mapping>  <servlet-name>ServerMachine</servlet-name>  <url-pattern>/ServerMachine</url-pattern>  </servlet-mapping>  </web-app>

图中需要注意的就是servlet-name,可以修改成你自己喜欢的名字,至于具体这个web.xml里面各个字段的意义,我其实也不清楚,我对java不了解,我一直从事C++开发。当时自己尝试了很多遍。如果你配置的时候发布到Tomcat启动不了,那么请反复修改下吧。

此处还需要注意需要有个index.jsp这个脚本,如下:

index.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><base href="<%=basePath%>"><title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">--></head><body>This is my JSP page. <br></body>
</html>

这两个文件的放置的位置也很关键,如果不对,是会出错的。见下图:

4 发布到Tomcat,启动hessian_server

这一步的前提是需要在Eclipse中新建Server并配置好。过程略。毕竟现在不会java的不太多了,我当时为了这小个问题还折腾了好久。

成功后如下:
这里注意到上面的URL: http://localhost:8080/hessian_server,这个地址就是hessian服务端的地址,实际情况将localhost换成服务端所在的IP地址,这个地址客户端需要用到。

hessian服务端到这里就完了。这里我只是用了最简单的方式来设置,实际比较复杂的情况下可以使用spring等,具体我还没研究过。

接下来就是hessian客户端的开发了!!

hessain 客户端

  1. Eclipse中新建Java Project

  2. 导入下载的hessian-4.0-37.jar,右键build path->Add to Build path
    导入完成如图:

  3. 开发步骤

    hessian客户端的开发涉及到2个部分。定义接口&&客户端主程序

    • 定义接口

把上面服务端定义好的接口文件IBasic.java原样复制到工程中。

  • 客户端主程序

新建HessianClient.java,随便命名。

package test;import com.caucho.hessian.client.HessianProxyFactory;public class HessianClient{public static void main(String []args)   throws Exception   {   String url = "http://localhost:8080/hessian_server/ServerMachineTest";   HessianProxyFactory factory = new HessianProxyFactory();   IBasic basic = (IBasic) factory.create(IBasic.class, url); String helloreturn = basic.hello();System.out.println(helloreturn);}
}

注意上面的URL地址。

主要步骤定义服务端的地址URL,然后new一个代理工厂HessainProxyFactory,这个代理类工厂负责远程调用。 然后就可以像调用本地函数一样,调用在IBasic.java中定义好的接口函数hello()。

4 启动客户端

项目上右键Run as->Java Application启动客户端。
成功后结果如下:

至此,小结

至此,完成了Hessian 客户端和服务端的通信。现在回过头来看,可能会觉得比较简单。当时还是折腾了好一会呢!! 简单来说,服务端定义并实现服务,发布到Tomcat,客户端新建一个代理,就像调用本地函数那样调用远程的服务端提供的函数,完成通信。

那么Hessian的底层具体是怎么实现的呢?客户端和服务端是怎么完成了序列化,并反序列的?客户端的代理类工厂是怎么实现的?这些我可能会留到另外的博客里分析。

写完了

写这篇文章是回过头来写,大概中间隔了快4个月的时间,为了写这篇博客,里面用到的一些图片,我又从头搭建了一个服务端和客户端,还是碰到了一些小问题,说明过了段时间是会陌生的。最好的时间是做完那个关于Hessain的项目就应该记录下过程,可以节省很多时间。

坚持写博客还是挺困难的,后面有时间打算再写分析下Hessian的源码以及C++版的Hessain,以及做其他项目涉及到的一些东西。

Blog:

  • rebootcat.com (默认)

Hessian通信案例(java)相关推荐

  1. Java进阶:基于TCP的网络实时聊天室(socket通信案例)

    目录 开门见山 一.数据结构Map 二.保证线程安全 三.群聊核心方法 四.聊天室具体设计 0.用户登录服务器 1.查看当前上线用户 2.群聊 3.私信 4.退出当前聊天状态 5.离线 6.查看帮助 ...

  2. 基于TCP的网络实时聊天室(socket通信案例)

    开门见山 一.数据结构Map 二.保证线程安全 三.群聊核心方法 四.聊天室具体设计 0.用户登录服务器 1.查看当前上线用户 2.群聊 3.私信 4.退出当前聊天状态 5.离线 6.查看帮助 五.聊 ...

  3. 分布式.RPC-WebService入门案例(java实现,注解实现,xsd文件解析,wsdl文件解析)

     系列博文: 分布式.RPC调用-RMI & Hessian框架_闲猫的博客-CSDN博客 分布式.RPC-WebService三要素,三个规范, Soap协议_闲猫的博客-CSDN博客 分布 ...

  4. hessian c java_java和c#使用hessian通信的方法

    本文实例讲述了java和c#使用hessian通信的方法,是非常实用的技巧.分享给大家供大家参考.具体分析如下: 首先,hessian主页为:http://hessian.caucho.com/ 下面 ...

  5. Win10 平台C#与低功耗蓝牙BLE设备通信案例

    前几天接了个单,客户要在win10电脑上做个工具软件,跟蓝牙锁设备相互通信.一开始以为是普通的蓝牙设备呢,收到客户寄来的测试设备,才发现是低功耗BLE蓝牙设备. PS:当时我研发用的台式机是没有蓝牙设 ...

  6. python 网络编程之Socket通信案例消息发送与接收

    背景 网络编程是python编程中的一项基本技术.本文将实现一个简单的Socket通信案例消息发送与接收 正文 在python中的socket编程的大致流程图如上所示 我们来首先编写客户端的代码: # ...

  7. java sslsocket程序_JAVA与C++进行sslsocket通信,JAVA做服务端或客户端

    前几天有位网友问我关于Unity3D里面使用Protobuf的方法,一时有事拖到现在才写这篇文章,不好意思哈. 本文测试环境: 系统:WINDOWS 7(第3.6步).OS X 10.9(第4步) 软 ...

  8. 《Linux高性能服务器编程》学习总结(四)——TCP/IP通信案例:访问Internet上的Web服务器...

    第四章      TCP/IP通信案例:访问Internet上的Web服务器 HTTP协议是工作在应用层上的协议,其应用十分广泛,而在进行通信的过程中,经常使用HTTP代理服务器.HTTP代理服务器主 ...

  9. 创龙基于AM5728平台的PCIe通信案例(一)

    本次PCIe通信案例测试基于AM5728平台,篇幅较长,共分为三部分,分别阐述:AM57x与Artix-7FPGA.AM57x与Kintex-7 FPGA.AM57x与TMS320C66x DSP的P ...

最新文章

  1. 这是2018年的第一场AI生态论坛,比以往来得更早一些
  2. mysql数据库定点任务_MySQL数据库Event定时执行任务详解
  3. Windows编程—Windows驱动开发环境搭建
  4. C语言 判断两个字符串大小相等关系
  5. SLAM Cartographer(3)定位和子图构建节点
  6. java step1:基础知识1
  7. 漫画:如何给女朋友解释什么是系统可用性?| 技术头条
  8. 明天要去面试...........
  9. 【solr基础教程之中的一个】Solr相关知识点串讲
  10. uipath 收邮件_UIpath 循环读取IMAP邮件,并保存附件
  11. DEA模型及matlab应用3:SBM-DEA 模型
  12. 运动控制系统课程设计
  13. 银行家算法(C++实现)
  14. 清华大学推荐:这32本书籍你看过几本?
  15. 【科研学术】Typora之markdown公式,汇总,看这一篇就够了~
  16. Ansible剧本示例
  17. 吴恩达创办Coursera是受他启发!74岁老父亲自述终身学习路,8年学完146门课程
  18. S3C2440-GPIO和jlink配置
  19. dede的文档关键词维护,就是自动加内链锚文本
  20. S32 Design Studio(S32DS) 如何打开已有工程以及无法打开工程问题解释

热门文章

  1. 1.数字图像获取:1.4图像的数据结构与特征
  2. 读后感与机翻《整体的三维场景解析和重建从单一的RGB图像》
  3. 【神经网络】(16) MobileNetV3 代码复现,网络解析,附Tensorflow完整代码
  4. Linux常用20条命令
  5. oracle 10.2 64位,Oracle 10.2.0.5 x64升级到11.2.0.3 x64
  6. MySQL拦截器获取xml id_关于mybatis拦截器,有谁知道怎么对结果集进行拦截,将指定字段查询结果进行格式化...
  7. CUDA Samples目录
  8. JavaScript原生代码处理JSON的一些高频次方法合集
  9. VS2019生成C++开发的exe文件可以在无VS的PC上运行的方法
  10. ATS 5.3.0在反向代理模式下实现正向代理功能方法