一个简单的利用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>的话,再转型的时候会报下面这样的错误:

示例代码下载

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

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. android笔记---主界面(一)

    <?xml version="1.0" encoding="utf-8"?> <TabHost xmlns:android="htt ...

  2. DIOCP开源项目-高效稳定的服务端解决方案(DIOCP + 无锁队列 + ZeroMQ + QWorkers) 出炉了

    [概述] 自从上次发布了[DIOCP开源项目-利用队列+0MQ+多进程逻辑处理,搭建稳定,高效,分布式的服务端]文章后,得到了很多朋友的支持和肯定.这加大了我的开发动力,经过几个晚上的熬夜,终于在昨天 ...

  3. spring-kafka手动提交offset

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  4. 【转】Mysql千万级数据表结构修改

    当需要对表进行ddl操作如加索引.增删列时,数据量小时直接在线修改表结构影响不大当表达到百万.千万数据就不能直接在线修改表结构 下面是具体的过程:1.备份数据select * from ih_orde ...

  5. new、delete、以及queue类

    本来以为很容易的,结果还是写了我两个小时. 用指针模拟queue类,再加上类,各种错误,总算是解决掉了-- #include<iostream> #include<cstdlib&g ...

  6. 一个JS引发的血案

    转载一篇大师傅的文章: 原文链接:http://xn--i2r.ml/index.php/2017/08/05/39.html 又到了周末,闲来无聊,挖挖补天 找了个目标,发现一个站 查看源码发现一个 ...

  7. myeclipse之SSH整合图文详解

    首先搭建开发环境 打开MyEclipse,新建一个web project ,然后右击项目执行如下步骤: 开启服务器无错误即搭建成功,整合后项目目录: 另附上SSH所必须的开发包:

  8. Android 底部按钮BottomNavigationView + Fragment + viewPager 的使用(一)

    实现的效果,左右滑动,底部栏跟着滑动,中间加的是分帧的页面        上代码:主页面activity_main.xml <?xml version="1.0" encod ...

  9. [转]oracle在删除表\表空间\用户时,如何释放磁盘空间

    一.drop表 执行drop table xx 语句 drop后的表被放在回收站(user_recyclebin)里,而不是直接删除掉.这样,回收站里的表信息就可以被恢复,或彻底清除. 通过查询回收站 ...

  10. 怎样用Google APIs和Google的应用系统进行集成(2)----Google APIs的全部的RESTFul服务一览

    上篇文章,我提到了,Google APIs暴露了86种不同种类和版本号的API.我们能够通过在浏览器里面输入https://www.googleapis.com/discovery/v1/apis这个 ...