Hessian示例:Java和C#通信
一个简单的利用Hessian在Java和C#之间通信的例子,服务端为Java,客户端为C#。
资源下载
先要准备好C#和Java的第三方类库:http://hessian.caucho.com/
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(12); //传递对象 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>的话,再转型的时候会报下面这样的错误:
示例代码下载
作者:zhanjindong
出处:http://www.cnblogs.com/zhanjindong
个人博客:http://zhanjindong.com
关于:一个程序员而已
说明:目前的技术水平有限,博客定位于学习心得和总结。
出处:http://www.cnblogs.com/zhanjindong
个人博客:http://zhanjindong.com
关于:一个程序员而已
说明:目前的技术水平有限,博客定位于学习心得和总结。