本文实例讲述了java和c#使用hessian通信的方法,是非常实用的技巧。分享给大家供大家参考。具体分析如下:

首先,hessian主页为:http://hessian.caucho.com/

下面通过一个简单的例子学习hessian服务:服务端为Java,客户端为C#。

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

下载 Hssiancharp.dll及hessian-4.0.37.jar

Hessian服务端(java):

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

创建一个通信接口IHello:

package hessian.test.server;

import java.util.ArrayList;

public interface IHello {

String sayHello(String msg);

void sayHello2(int bean);

void print(String msg);

HelloBean getData(HelloBean bean);

ArrayList getBeanList();

ComplexData getComplexData();

}

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

package hessian.test.server;

import java.util.ArrayList;

public class HelloImpl implements IHello{

public String sayHello(String msg){

return "Hello " + msg;

}

public void sayHello2(int bean){

System.out.println("Hello " + bean);

}

public void print(String msg){

System.out.println(msg);

}

public HelloBean getData(HelloBean bean){

HelloBean result = new HelloBean();

result.setName("lu xiaoxun a new name");

result.setAge(26);

System.out.print(bean.getName());

return result;

}

public ArrayList getBeanList(){

ArrayList beans = new ArrayList();

HelloBean b1 = new HelloBean();

b1.setName("lu1");

b1.setAge(26);

beans.add(b1);

HelloBean b2 = new HelloBean();

b2.setName("lu2");

b2.setAge(27);

beans.add(b2);

return beans;

}

public ComplexData getComplexData(){

ComplexData data = new ComplexData();

ArrayList beans = getBeanList();

data.setData(beans, beans.size());

return data;

}

}

定义用来进行数据传输的类,两个类都必须实现Serializable接口:

HelloBean.java

package hessian.test.server;

import java.io.Serializable;

public class HelloBean implements Serializable {

private static final long serialVersionUID = 570423789882653763L;

private String name;

private int age;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge(){

return age;

}

public void setAge(int age){

this.age = age;

}

}

ComplexData.java

package hessian.test.server;

import java.io.Serializable;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.Map;

public class ComplexData implements Serializable{

private static final long serialVersionUID = 1L;

private ArrayList helloBeans;

//private Map helloBeanMap;

private int number;

public int getNumber(){

return number;

}

public ArrayList getHelloBeans(){

return helloBeans;

}

public void setData(ArrayList beans, int num){

this.number = num;

this.helloBeans = beans;

// helloBeanMap = new HashMap();

// for (HelloBean helloBean : beans) {

// if(!helloBeanMap.containsKey(helloBean.getName()))

// {

// helloBeanMap.put(helloBean.getName(), helloBean);

// }

// }

}

}

web.xml内容:

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">

hessian server

hessian

com.caucho.hessian.server.HessianServlet

service-class

hessian.test.server.HelloImpl

hessian

/hessian

Hessian客户端(c#):

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

public interface IHello

{

String sayHello(String msg);

void sayHello2(int bean);

void print(String msg);

HelloBean getData(HelloBean bean);

HelloBean[] getBeanList();

ComplexData getComplexData();

}

定义与服务器端一致的的通信数据类:

HelloBean.cs:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace hessian.test.server

{

public class HelloBean

{

public String Name

{

set { name = value; }

get { return name; }

}

private String name; //类型和名称需要和服务器端一致

public int Age

{

set { age = value; }

get { return age; }

}

private int age; //类型和名称需要和服务器端一致

public override String ToString()

{

return "Name: "+ name + " Age: " + age;

}

}

}

ComplexData.cs:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace hessian.test.server

{

public class ComplexData

{

private HelloBean[] helloBeans;

//private Dictionary helloBeanMap;

private int number;

public int GetNumber()

{

return number;

}

public HelloBean[] GetBeans()

{

return helloBeans;

}

//public Dictionary GetBeansDic()

//{

// return helloBeanMap;

//}

}

}

在主项目中添加Hessiancsharp.dll引用。

测试代码:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using hessiancsharp.client;

using hessian.test.server;

namespace HessianClientTest

{

class Program

{

static void Main(string[] args)

{

string url = @"http://localhost:8080/HessianServerTest/hessian";

CHessianProxyFactory factory = new CHessianProxyFactory();

IHello test = (IHello)factory.Create(typeof(IHello), url);

//Test function

Console.WriteLine(test.sayHello("lu")); //打印从服务器端获取的字符串

test.sayHello2(12); //在服务器端控制台打印 "Hello 12"

test.print("hessian"); //在服务器端控制台打印 "hessian"

//Test Object

HelloBean bean = new HelloBean();

//bean.setName("lu xiaoxun");

bean.Name = "luxiaoxun";

HelloBean result = test.getData(bean);

Console.WriteLine(result.Name);

Console.WriteLine(result.Age);

Console.WriteLine(result);

//Test Object Array

HelloBean[] beans = test.getBeanList();

if (beans != null)

{

foreach (HelloBean data in beans)

{

Console.WriteLine(data.ToString());

}

}

//Test complex data

ComplexData complexData = test.getComplexData();

if (complexData != null)

{

Console.WriteLine("Array number: " + complexData.GetNumber());

HelloBean[] comArray = complexData.GetBeans();

if (comArray != null)

{

foreach (HelloBean data in comArray)

{

Console.WriteLine(data.ToString());

}

}

//Dictionary helloBeanMap = complexData.GetBeansDic();

//if (helloBeanMap != null)

//{

// foreach (String key in helloBeanMap.Keys)

// {

// Console.WriteLine(helloBeanMap[key].GetHelloBeanInfo());

// }

//}

}

Console.ReadKey();

}

}

}

测试结果如下图所示:

注意事项:

1、服务端和客户端用于数据传递的对象的命名空间要一致

IHello接口所在命名空间服务端和客户端可以不一致,但是IHello中用到的HelloBean和ComplexData在Java服务端和C#客户端中两个HelloBean类所在的命名空间要一致。

2、类的字段要一致

用于数据传输的类的字段名和字段类型要一致(修饰类型可以不一致)。

3、服务端的类要序列化

4、尽量使用基本的数据类型

从上面的测试可以看出,传递基本的类型没有问题,传递普通的类对象没有问题,传递ArrayList的时候也没有问题(C#客户端使用Array数组),但是传递HashMap字典的时候会有问题,C#这边使用Dictionary没法对应一致,可能是由于hash函数内部实现不一致导致的,具体原因不明。

感兴趣的朋友可以测试一下本文实例,源码点击此处本站下载。

hessian c java_java和c#使用hessian通信的方法相关推荐

  1. 子组件调用父组件方法_vue父子组件通信以及非父子组件通信的方法

    组件是 vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用.一般来说,组件可以有以下几种关系,父子关系.兄弟关系和隔代关系,简化点可以分为父子关系和 ...

  2. java condition详解_Java使用Condition控制线程通信的方法实例详解

    Java使用Condition控制线程通信的方法实例详解 发布于 2020-4-20| 复制链接 摘记: 本文实例讲述了Java使用Condition控制线程通信的方法.分享给大家供大家参考,具体如下 ...

  3. iic裸机与linux通信,基于IIC协议的Linux操作系统与裸机通信的方法

    主权项: 1.一种基于IIC协议的Linux操作系统与裸机通信的方法,其特征在于,包括如下步骤:步骤S1,对采用Linux系统的多个硬件和裸机同时挂载在总线上,包括:配置一个主机设备和多个从机设备,每 ...

  4. 基于VC++开发串口通信的方法

    串行通信中的关键是串行通信设备的初始化.数据的发送和接收及其实现方式. 在Dos环境下,用户可以直接对通信设备编程,可以通过查询中断的方式使用通信设备.但是Windows不提倡应用程序直接控制硬件,而 ...

  5. android php 实时通信,Android_Android实现Activity之间通信的方法,本文实例讲述了Android实现Activi - phpStudy...

    Android实现Activity之间通信的方法 本文实例讲述了Android实现Activity之间通信的方法.分享给大家供大家参考.具体如下: 在一个Activity中可以使用系统提供的start ...

  6. 一种即时通信数据传输方法、客户端、服务器及系统

    一种即时通信数据传输方法.客户端.服务器及系统  摘要 本发明实施例提供一种即时通信数据传输方法.客户端.服务器及系统,其中,方法可以包括:向服务器发送传输控制协议TCP连接建立请求,建立与所述服务器 ...

  7. 评估人-自主系统团队通信的方法(1)

    译者:关天海,何瑞麟,庄琰,刘欣,段承序,王玉虎,于栖洋,胡少波 摘要 对团队通信的评估可以为团队动态.凝聚力.信任和联合任务的绩效提供关键的见解.尽管许多基于通信的措施已经在人类团队中进行了测试和验 ...

  8. 西门子S7300PLC转以太网连接CHNet-S7300MD实现以太网通信配置方法

    西门子S7300PLC转以太网连接CHNet-S7300MD实现以太网通信配置方法 产品简介 兴达易控CHNet-S7300MD用于西门子S7-200/SMART S7-200/S7-300/S7-4 ...

  9. vue父子组件通信以及非父子组件通信的方法

    组件是 vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用.一般来说,组件可以有以下几种关系,父子关系.兄弟关系和隔代关系,简化点可以分为父子关系和 ...

最新文章

  1. 改变电子商务行业业务的人工智能趋势
  2. Dynamic CRM 2013学习笔记(十八)根据主表状态用JS控制子表自定义按钮
  3. 与孩子一起学编程 python_【和孩子一起学编程】 python笔记--第五天
  4. 关于select—页面中的ListBox的Javascript
  5. CSS中一个font缩写的实例
  6. 自定义SpringBoot start 被依赖时 程序包不存在的问题
  7. php注册登录遍写入 遍验证,自动注册登录验证机制的php代码
  8. 【转】DICOM文件格式剖析(初识)
  9. cstring::replace不区分大小写_Excel VBA之函数篇-3.11订单号千奇百怪,如何按照结构区分来源...
  10. 阶段1 语言基础+高级_1-3-Java语言高级_09-基础加强_第1节 基础加强_4_Junit_@Before@After...
  11. matlab哈明窗带阻,MATLAB数字滤波器程序 Hamming窗带通滤波器
  12. 初学java,有哪些值得推荐的 Java 练手项目?
  13. gitbook生成目录toc
  14. 微信小程序 wx.getUserProfile返回的iv、encryptedData 解密获取不到openId的问题解决方案 openId无返回
  15. 如何删除电脑浏览记录
  16. 【MM小贴士】特殊采购类型40
  17. 不止SQL优化,数据库还有哪些优化大法?
  18. python如何实现找图_python实现图片筛选程序
  19. c语言中swith的用法,初中英语语法知识点大全+记忆口诀+易错题100道,考前复习...
  20. UnityShader水体渲染

热门文章

  1. win与“黑苹果”的文件共享
  2. php move函数,php 文件上传 move_uploaded_file
  3. 苹果手机nfc怎么复制门禁卡
  4. Java 枚举工具类
  5. Linux下的MP3播放程序
  6. 自定义 swap 函数
  7. 动态规划:0-1背包问题
  8. Css margin 和 float浮动
  9. 基于3D视觉的高速三维机器视觉成像系统
  10. [linux] linux使用dd命令制作硬盘镜像