一个简单的利用Hessian在Java和C#之间通信的例子,服务端为Java,客户端为C#。

资源下载

先要准备好C#和Java的第三方类库:http://hessian.caucho.com/

Hssiancharp.dll

hessian-4.0.37.jar

Hessian服务端

打开eclipse创建一个Dynamic Web Project,将hessian-4.0.37.jar放到lib下,大概如图所示:

创建一个接口:Hello.java

  1. package hessian.test.server;
  2.  
  3. import hessian.test.client.HelloBean;
  4.  
  5. public interface Hello {
  6. public String sayHello(String smt);
  7. public void printHello(String smt);
  8. public void sayHello2(int bean);
  9. public HelloBean sayHello3(HelloBean bean);
  10. }

Hello接口的一个实现:HelloImpl.java

  1. package hessian.test.server;
  2.  
  3. import hessian.test.client.HelloBean;
  4.  
  5. public class HelloImpl implements Hello {
  6. public String sayHello(String smt) {
  7. return smt != null ? "hello " + smt : "hello hessian";
  8. }
  9.  
  10. public void printHello(String smt) {
  11. System.out.println("Hello " + smt);
  12. }
  13.  
  14. //不能有重载
  15. public void sayHello2(int bean) {
  16. System.out.println(bean);
  17. }
  18.  
  19. public HelloBean sayHello3(HelloBean bean) {
  20. HelloBean result=new HelloBean();
  21. result.setName("cyy");
  22.  
  23. System.out.print(bean.getName());
  24. return result;
  25. }
  26. }

一个Java Bean:HelloBean.java

  1. package hessian.test.client;
  2.  
  3. import java.io.Serializable;
  4.  
  5. //该类必须实现Serializable接口,能进行序列化。
  6. public class HelloBean implements Serializable{
  7. private String name;
  8.  
  9. public String getName() {
  10. return name;
  11. }
  12.  
  13. public void setName(String name) {
  14. this.name = name;
  15. }
  16. }

web.xml内容:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  4. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
  5. id="WebApp_ID" version="3.0">
  6. <display-name>hessian server</display-name>
  7. <servlet>
  8. <servlet-name>hessian</servlet-name>
  9. <servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class>
  10. <init-param>
  11. <param-name>service-class</param-name>
  12. <param-value>hessian.test.server.HelloImpl</param-value>
  13. </init-param>
  14. </servlet>
  15. <servlet-mapping>
  16. <servlet-name>hessian</servlet-name>
  17. <url-pattern>/hessian</url-pattern>
  18. </servlet-mapping>
  19. </web-app>

Hessian客户端

打开Visual Studio创建一个C#控制台程序,引用Hessiancharp.dll,大概如图所示:

定义一个与服务端对应Hello接口:Hello.cs

  1. using System;
  2.  
  3. namespace hessian.test.client
  4. {
  5. interface Hello
  6. {
  7. string sayHello(string smt);
  8. void printHello(string smt);
  9. void sayHello2(int bean);
  10. HelloBean sayHello3(HelloBean bean);
  11. }
  12. }

一个与服务端HelloBean对应的HelloBean.cs:

  1. using System;
  2.  
  3. //需要相同的命名空间
  4. namespace hessian.test.client
  5. {
  6. //该类必须和Hessian服务端中Java类一致
  7. public class HelloBean
  8. {
  9. //字段名相同
  10. private String name;
  11.  
  12. //具有相同的geter和seter
  13. public String getName()
  14. {
  15. return name;
  16. }
  17.  
  18. public void setName(String name)
  19. {
  20. this.name = name;
  21. }
  22. }
  23. }

测试代码:Program.cs

  1. using System;
  2. using hessiancsharp.client;
  3.  
  4. namespace hessian.test.client
  5. {
  6. class Program
  7. {
  8. static void Main(string[] args)
  9. {
  10. string url = @"http://localhost:8080/HessianServer/hessian";
  11. CHessianProxyFactory factory = new CHessianProxyFactory();
  12.  
  13. Hello test = (Hello)factory.Create(typeof(Hello), url);
  14. Console.WriteLine(test.sayHello("zhanjindong"));//打印从服务器端获取的字符串
  15. test.printHello("Hessian"); //在服务器端控制台打印 "Hello Hessian"
  16. test.sayHello2();
  17.  
  18. //传递对象
  19. HelloBean bean = new HelloBean();
  20. bean.setName("zhanjindong");
  21.  
  22. HelloBean result = test.sayHello3(bean);
  23. Console.WriteLine(result.getName());
  24. }
  25. }
  26. }

测试结果:

注意事项

示例还是很简单的,但是有几点需要注意的:

接口方法不能重载

  1. public interface Hello {
  2. public void printHello(String smt);
  3. public String sayHello(String smt);
  4. public void sayHello2(int bean);
  5. public HelloBean sayHello3(HelloBean bean);
  6. }

sayHello和sayHello2必须名称不一样。

对象的命名空间要一致

Hello接口中的sayHello3用到了HelloBean那么在Java服务端和C#客户端中两个HelloBean类所在的命名空间要一致

类的结构要一致

示例中的HelloBean在C#中的实现和在Java中一模一样,相同的字段名,相同的geter和seter。

传递的对象需要序列化

尽量使用简单的基本的数据类型

Hessian会将Java Bean中的List<T>和数组类型都处理为C#中的ArrayList,所以如果传递的对象中有List<T>的话,再转型的时候会报下面这样的错误:

示例代码下载

点这里下载上面示例的代码。

Hessian示例:Java和C#通信的更多相关文章

  1. bugzilla4的xmlrpc接口api调用实现分享: xmlrpc + https + cookies + httpclient +bugzilla + java实现加密通信下的xmlrpc接口调用并解决登陆保持会话功能

    xmlrpc .  https . cookies . httpclient.bugzilla . java实现加密通信下的xmlrpc接口调用并解决登陆保持会话功能,网上针对bugzilla的实现很 ...

  2. [java]序列化框架性能对比(kryo、hessian、java、protostuff)

    序列化框架性能对比(kryo.hessian.java.protostuff) 简介:   优点 缺点 Kryo 速度快,序列化后体积小 跨语言支持较复杂 Hessian 默认支持跨语言 较慢 Pro ...

  3. Flex通信-与Java实现Socket通信实例

    Flex通信-与Java实现Socket通信实例  转自:http://blessht.iteye.com/blog/1136888 博客分类: Flex 环境准备 [服务器端] JDK1.6,“ja ...

  4. 序列化框架性能对比(kryo、hessian、java、protostuff)

    简介:   优点 缺点 Kryo 速度快,序列化后体积小 跨语言支持较复杂 Hessian 默认支持跨语言 较慢 Protostuff 速度快,基于protobuf 需静态编译 Protostuff- ...

  5. Java线程间通信-回调的实现方式

    Java线程间通信-回调的实现方式   Java线程间通信是非常复杂的问题的.线程间通信问题本质上是如何将与线程相关的变量或者对象传递给别的线程,从而实现交互.   比如举一个简单例子,有一个多线程的 ...

  6. C# 通过hessian调Java注意事项

    照理说C#可以通过标准的web服务可以轻松地调用Java,但是鉴于hessian的高性能及开发效率,个人认为C#通过hessian调用java是很值得提倡的.之前完成的一个比较大型的企业应用项目就是采 ...

  7. java socket报文通信(一)socket的建立

    java socket报文通信(一) socket的建立  今天来和大家分享一下java中如何使用socket进行通信.先来啰嗦两句,看看Tcp/ip和udp: TCP是Transfer Contro ...

  8. Java实现串口通信的小样例

    用Java实现串口通信(windows系统下),须要用到sun提供的串口包 javacomm20-win32.zip.当中要用到三个文件,配置例如以下: 1.comm.jar放置到 JAVA_HOME ...

  9. Java 多线程间通信

    JDK 1.5 以后, 将同步和锁封装成了对象, 并将操作锁的隐式方法定义到了该对象中, 将隐式动作变成了显示动作. Lock 接口 Lock 接口, 位于 java.util.concurrent. ...

随机推荐

  1. (原创)c++11改进我们的程序之垃圾回收

    c#和java中有自动垃圾回收机制,.net运行时和java虚拟机可以管理分配的堆内存,在对象失去引用时自动回收,因此在c#和jva中, 内存管理不是大问题.c++语言没有垃圾回收机制,必须自己去释放 ...

  2. python(40):利用utf-8编码判断中文英文字符

    #!/usr/bin/env Python # -*- coding:GBK -*- """汉字处理的工具: 判断unicode是否是汉字,数字,英文,或者其他字符. 全 ...

  3. Spark SQL inferSchema实现原理探微(Python)【转】

    使用Spark SQL的基础是“注册”(Register)若干表,表的一个重要组成部分就是模式,Spark SQL提供两种选项供用户选择:   (1)applySchema     applySche ...

  4. Linux环境系搭建Git服务器过程全纪录

    Last :: from 139.199.180.186 [root@VM_219_131_centos ~]# yum install curl-devel expat-devel gettext- ...

  5. Eclipse - Mac Os Default JRE missing

    转:http://stackoverflow.com/questions/1736993/eclipse-mac-os-default-jre-missing 1) Follow Joshua's a ...

  6. 可嵌入图片视频jQuery全屏滑块

    分享一款可嵌入图片视频jQuery全屏滑块.这是一款可定制的滑块幻灯片代码,支持键盘箭头切换.效果图如下: 在线预览   源码下载 实现的代码. html代码:     <script type ...

  7. Mongo分区后分片下count记录不准确

    问题描述 问题如图,后来上网查了一下,发现了这是正常现象: 官方文档解释了这种现象的原因以及解决方法: 不准确的原因: 操作的是分片的集合(前提): shard分片正在做块迁移,导致有重复数据出现 存 ...

  8. <聪明的投资者(第四版点评)>读书笔记

    书在这里 企业的内在价值并不依赖于其股票价格 投资者的最大问题甚至最可怕的敌人,很可能就是他们自己 投资者不能指望通过买任何新股或“热门”股,而获得优于平均水平的收益.从长远来看,这几乎无疑会产生相反 ...

  9. TP v5中环境变量在项目中的应用

    环境变量,顾名思义就是在不同的系统环境,同一个变量的值可以有所不同. 如开发环境.测试环境与正式环境下,数据库配置.静态资源文件Url前缀.缓存.各种key等配置都不相同,对于提交到仓库中的代码,理论 ...

  10. 放弃winform的窗体吧,改用html作界面,桌面应用程序UI的新的开发方式。

    做过很多winform项目,都为winform控件头疼不已.想实现一些漂亮的样子总是很难.我这里列举几个缺点: 1.winform控件大多是 绝对布局 ,你需要给出准确的坐标.那么在实现居中效果就会很 ...