zoukankan      html  css  js  c++  java
  • Hessian示例:Java和C#通信

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

    示例代码下载

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

  • 相关阅读:
    CSS——实现图像远距离翻转效果
    《精通CSS》一个下拉菜单的例子
    将博客搬至CSDN
    44个Java代码性能优化总结
    QRCode 二维码生成
    Linux命令
    spring
    ajax 学习总结
    Servlet+Ajax实现搜索框智能提示代码
    搜索框智能提示
  • 原文地址:https://www.cnblogs.com/zhanjindong/p/3383964.html
Copyright © 2011-2022 走看看