-
C#教程之java和c#使用hessian通信的方法
本文实例讲述了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:
1
2
3
4
5
6
7
8
9
10
11
|
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<HelloBean> getBeanList(); ComplexData getComplexData(); } |
IHello接口的一个实现:HelloImpl.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
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<HelloBean> getBeanList(){ ArrayList<HelloBean> beans = new ArrayList<HelloBean>(); 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<HelloBean> beans = getBeanList(); data.setData(beans, beans.size()); return data; } } |
定义用来进行数据传输的类,两个类都必须实现Serializable接口:
HelloBean.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
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<HelloBean> helloBeans; //private Map<String, HelloBean> helloBeanMap; private int number; public int getNumber(){ return number; } public ArrayList<HelloBean> getHelloBeans(){ return helloBeans; } public void setData(ArrayList<HelloBean> beans, int num){ this .number = num; this .helloBeans = beans; // helloBeanMap = new HashMap<String, HelloBean>(); // for (HelloBean helloBean : beans) { // if(!helloBeanMap.containsKey(helloBean.getName())) // { // helloBeanMap.put(helloBean.getName(), helloBean); // } // } } } |
web.xml内容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
<? xml version = "1.0" encoding = "UTF-8" ?> xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 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客户端(c#):
定义一个与服务端对应的IHello接口:IHello.cs
1
2
3
4
5
6
7
8
9
|
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:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
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:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace hessian.test.server { public class ComplexData { private HelloBean[] helloBeans; //private Dictionary<String, HelloBean> helloBeanMap; private int number; public int GetNumber() { return number; } public HelloBean[] GetBeans() { return helloBeans; } //public Dictionary<String, HelloBean> GetBeansDic() //{ // return helloBeanMap; //} } } |
在主项目中添加Hessiancsharp.dll引用。
测试代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
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) { 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<String, HelloBean> 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函数内部实现不一致导致的,具体原因不明。
感兴趣的朋友可以测试一下本文实例,源码点击此处本站下载。