Hessian通信案例(java)
个人博客: 戳我,戳我
前言
由于工作的原因,接触到了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 服务端
Eclipse中新建Dynamic Web Project
此处可以看到需要选择Target runtime,需要首先安装Tomcat。导入下载的hessian-4.0-37.jar,右键build path->Add to Build path
导入完成如图:开发步骤
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 客户端
Eclipse中新建Java Project
导入下载的hessian-4.0-37.jar,右键build path->Add to Build path
导入完成如图:开发步骤
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)相关推荐
- Java进阶:基于TCP的网络实时聊天室(socket通信案例)
目录 开门见山 一.数据结构Map 二.保证线程安全 三.群聊核心方法 四.聊天室具体设计 0.用户登录服务器 1.查看当前上线用户 2.群聊 3.私信 4.退出当前聊天状态 5.离线 6.查看帮助 ...
- 基于TCP的网络实时聊天室(socket通信案例)
开门见山 一.数据结构Map 二.保证线程安全 三.群聊核心方法 四.聊天室具体设计 0.用户登录服务器 1.查看当前上线用户 2.群聊 3.私信 4.退出当前聊天状态 5.离线 6.查看帮助 五.聊 ...
- 分布式.RPC-WebService入门案例(java实现,注解实现,xsd文件解析,wsdl文件解析)
系列博文: 分布式.RPC调用-RMI & Hessian框架_闲猫的博客-CSDN博客 分布式.RPC-WebService三要素,三个规范, Soap协议_闲猫的博客-CSDN博客 分布 ...
- hessian c java_java和c#使用hessian通信的方法
本文实例讲述了java和c#使用hessian通信的方法,是非常实用的技巧.分享给大家供大家参考.具体分析如下: 首先,hessian主页为:http://hessian.caucho.com/ 下面 ...
- Win10 平台C#与低功耗蓝牙BLE设备通信案例
前几天接了个单,客户要在win10电脑上做个工具软件,跟蓝牙锁设备相互通信.一开始以为是普通的蓝牙设备呢,收到客户寄来的测试设备,才发现是低功耗BLE蓝牙设备. PS:当时我研发用的台式机是没有蓝牙设 ...
- python 网络编程之Socket通信案例消息发送与接收
背景 网络编程是python编程中的一项基本技术.本文将实现一个简单的Socket通信案例消息发送与接收 正文 在python中的socket编程的大致流程图如上所示 我们来首先编写客户端的代码: # ...
- java sslsocket程序_JAVA与C++进行sslsocket通信,JAVA做服务端或客户端
前几天有位网友问我关于Unity3D里面使用Protobuf的方法,一时有事拖到现在才写这篇文章,不好意思哈. 本文测试环境: 系统:WINDOWS 7(第3.6步).OS X 10.9(第4步) 软 ...
- 《Linux高性能服务器编程》学习总结(四)——TCP/IP通信案例:访问Internet上的Web服务器...
第四章 TCP/IP通信案例:访问Internet上的Web服务器 HTTP协议是工作在应用层上的协议,其应用十分广泛,而在进行通信的过程中,经常使用HTTP代理服务器.HTTP代理服务器主 ...
- 创龙基于AM5728平台的PCIe通信案例(一)
本次PCIe通信案例测试基于AM5728平台,篇幅较长,共分为三部分,分别阐述:AM57x与Artix-7FPGA.AM57x与Kintex-7 FPGA.AM57x与TMS320C66x DSP的P ...
最新文章
- 这是2018年的第一场AI生态论坛,比以往来得更早一些
- mysql数据库定点任务_MySQL数据库Event定时执行任务详解
- Windows编程—Windows驱动开发环境搭建
- C语言 判断两个字符串大小相等关系
- SLAM Cartographer(3)定位和子图构建节点
- java step1:基础知识1
- 漫画:如何给女朋友解释什么是系统可用性?| 技术头条
- 明天要去面试...........
- 【solr基础教程之中的一个】Solr相关知识点串讲
- uipath 收邮件_UIpath 循环读取IMAP邮件,并保存附件
- DEA模型及matlab应用3:SBM-DEA 模型
- 运动控制系统课程设计
- 银行家算法(C++实现)
- 清华大学推荐:这32本书籍你看过几本?
- 【科研学术】Typora之markdown公式,汇总,看这一篇就够了~
- Ansible剧本示例
- 吴恩达创办Coursera是受他启发!74岁老父亲自述终身学习路,8年学完146门课程
- S3C2440-GPIO和jlink配置
- dede的文档关键词维护,就是自动加内链锚文本
- S32 Design Studio(S32DS) 如何打开已有工程以及无法打开工程问题解释
热门文章
- 1.数字图像获取:1.4图像的数据结构与特征
- 读后感与机翻《整体的三维场景解析和重建从单一的RGB图像》
- 【神经网络】(16) MobileNetV3 代码复现,网络解析,附Tensorflow完整代码
- Linux常用20条命令
- oracle 10.2 64位,Oracle 10.2.0.5 x64升级到11.2.0.3 x64
- MySQL拦截器获取xml id_关于mybatis拦截器,有谁知道怎么对结果集进行拦截,将指定字段查询结果进行格式化...
- CUDA Samples目录
- JavaScript原生代码处理JSON的一些高频次方法合集
- VS2019生成C++开发的exe文件可以在无VS的PC上运行的方法
- ATS 5.3.0在反向代理模式下实现正向代理功能方法