一个简单的利用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

package hessian.test.server;

import hessian.test.client.HelloBean;

public interface Hello {
public String sayHello(String smt);
public void printHello(String smt);
public void sayHello2(int bean);
public HelloBean sayHello3(HelloBean bean);
}

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

package hessian.test.server;

import hessian.test.client.HelloBean;

public class HelloImpl implements Hello {
public String sayHello(String smt) {
return smt != null ? "hello " + smt : "hello hessian";
} public void printHello(String smt) {
System.out.println("Hello " + smt);
} //不能有重载
public void sayHello2(int bean) {
System.out.println(bean);
} public HelloBean sayHello3(HelloBean bean) {
HelloBean result=new HelloBean();
result.setName("cyy"); System.out.print(bean.getName());
return result;
}
}

一个Java Bean:HelloBean.java

package hessian.test.client;

import java.io.Serializable;

//该类必须实现Serializable接口,能进行序列化。
public class HelloBean implements Serializable{
private String name; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}
}

web.xml内容:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>hessian server</display-name>
<servlet>
<servlet-name>hessian</servlet-name>
<servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class>
<init-param>
<param-name>service-class</param-name>
<param-value>hessian.test.server.HelloImpl</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>hessian</servlet-name>
<url-pattern>/hessian</url-pattern>
</servlet-mapping>
</web-app>

Hessian客户端

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

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

using System;

namespace hessian.test.client
{
interface Hello
{
string sayHello(string smt);
void printHello(string smt);
void sayHello2(int bean);
HelloBean sayHello3(HelloBean bean);
}
}

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

using System;

//需要相同的命名空间
namespace hessian.test.client
{
//该类必须和Hessian服务端中Java类一致
public class HelloBean
{
//字段名相同
private String name; //具有相同的geter和seter
public String getName()
{
return name;
} public void setName(String name)
{
this.name = name;
}
}
}

测试代码:Program.cs

using System;
using hessiancsharp.client; namespace hessian.test.client
{
class Program
{
static void Main(string[] args)
{
string url = @"http://localhost:8080/HessianServer/hessian";
CHessianProxyFactory factory = new CHessianProxyFactory(); Hello test = (Hello)factory.Create(typeof(Hello), url);
Console.WriteLine(test.sayHello("zhanjindong"));//打印从服务器端获取的字符串
test.printHello("Hessian"); //在服务器端控制台打印 "Hello Hessian"
test.sayHello2(); //传递对象
HelloBean bean = new HelloBean();
bean.setName("zhanjindong"); HelloBean result = test.sayHello3(bean);
Console.WriteLine(result.getName());
}
}
}

测试结果:

注意事项

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

接口方法不能重载

public interface Hello {
public void printHello(String smt);
public String sayHello(String smt);
public void sayHello2(int bean);
public HelloBean sayHello3(HelloBean bean);
}

sayHello和sayHello2必须名称不一样。

对象的命名空间要一致

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

类的结构要一致

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

传递的对象需要序列化

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

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

示例代码下载

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

最新文章

  1. FTPClient使用中的问题--获取当前工作目录为null
  2. 精通 CSS 选择器(二)
  3. zepto源码--核心方法3(属性相关)--学习笔记
  4. 第一个Object-C类
  5. HDU 1028(母函数)
  6. appjs desktop
  7. POJ 2318 TOYS(计算几何)
  8. Using Redis as Django&#39;s session store and cache backend
  9. JS 寻找孩子并打印路径
  10. B/S 和 C/S两种架构
  11. android获取短信并自动填充
  12. SDK踩坑全纪录
  13. 史上最全 原生javascript的知识总结,适合新手及查资料用!
  14. docker的安装及使用
  15. D - 文理分科 (网络流-&gt;最小割)
  16. ubuntu下安装maven(转载)
  17. 成为Java顶尖程序员 ,看这11本书就够了
  18. Java虚拟机笔记(一):类加载机制
  19. font:12px/1.5 tahoma, arial, \5b8b\4f53, sans-serif详解
  20. apache -- 端口被占用

热门文章

  1. chorme插件 ,在浏览器上模拟手机,pad 查看网页|前端技术开发必备插件
  2. 10个非常炫酷的jQuery相册动画赏析
  3. js实现类似微信网页版在可编辑的div中粘贴内容时过滤剪贴板的内容,光标始终在粘贴内容后面,以及将光标定位到最后的方法
  4. shell 删除文件过期文件
  5. java框架篇---Struts2的处理流程
  6. 我的zsh简单设置
  7. 《5天学会卡西欧fx-5800p之实操视频教程(初级)》目录和我的工作室现场曝光
  8. linux中注册系统服务—service命令的原理通俗
  9. 浅谈C#中的深拷贝(DeepCopy)与浅拷贝(MemberwiseClone)
  10. mongo源码学习(四)invariant