本文实例讲述了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. 如何隐藏system函数的窗口
  2. 面向对象设计原则之5-接口隔离原则
  3. html页面forEach用法,!foreach循环用在HTML中,请高手协助
  4. linux镜像下载和vmware虚拟主机部署
  5. 中继段光缆测试与用户光缆测试有什么区别?
  6. LoRaWAN协议格式
  7. 计算机键盘重复设置,教你操作win10系统电脑键盘打字时总是出现重复字符的方案...
  8. 【番外篇】利率二叉树模型对冲
  9. 血管老化30岁就开始!别怕,吃它就能搞定,让血管保持年轻~
  10. 教你DIY中文增强版Geexbox,且安装为硬盘版
  11. 世界上最大的开源基金会 Apache 是如何运作的?
  12. 自动排课系统V2.0基本完善了
  13. 哇咔咔!用Android手机控制电脑。
  14. Android注册页面
  15. LINUX 字体装在哪个文件夹里
  16. Centos服务器 查看不到IP地址
  17. 1024 科学计数法 (20 分) 完全解析(C++详细思路)
  18. 树莓派之更改开机画面
  19. RK3568触摸屏驱动调试总结
  20. 适用于AbpBoilerplate的阿里云腾讯云Sms短信服务

热门文章

  1. STM32常用协议之IIC协议详解
  2. 分布式一致性算法之Paxos
  3. JavaScript数据类型转换
  4. 外贸的营销高手的经典方法:EDM营销
  5. [葫芦娃linux记录贴]ubuntu如何安装flash插件
  6. Kibana常用命令
  7. 百度地图API:根据起始点经纬度坐标确认最佳路线规划
  8. 自动修改Windows组策略
  9. 海鸥表表带太长了怎么拆_表带怎么拆,太长了想截掉两节?
  10. java制作mp3_利用java制作简单的音乐播放器