Java和c#使用hessian通信

简介:
一个简单的例子学习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<HelloBean> 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<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
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<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内容:
<?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客户端(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<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引用。
  测试代码:
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<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函数内部实现不一致导致的,具体原因不明。

最新内容请见作者的GitHub页:http://qaseven.github.io/
相关文章
|
7天前
|
存储 Java 数据库连接
java多线程之线程通信
java多线程之线程通信
|
29天前
|
数据处理 C# C++
如何使用C#和C++结构体实现Socket通信
如何使用C#和C++结构体实现Socket通信
|
6月前
|
安全 Java 调度
Java多线程编程的默契对话:线程通信的艺术
Java多线程编程的默契对话:线程通信的艺术
38 0
|
7月前
|
网络协议 Java
Java TCP通信详解
TCP(Transmission Control Protocol)是一种面向连接的、可靠的网络传输协议,它提供了端到端的数据传输和可靠性保证。TCP通信适用于对数据传输的可靠性和完整性要求较高的场景,如文件传输、网页浏览等。本文将详细介绍Java中如何使用TCP协议进行网络通信,包括TCP套接字、服务器和客户端的创建、数据传输等。
128 0
|
7月前
|
Java
Java的Socket进行通信
下面是一个使用Java的Socket进行通信的简单示例
|
7月前
|
缓存 Dubbo Java
Java面试题顶级理解!Dubbo注册中心挂了,服务还可以继续通信吗?
什么情况?一位工作了 5 年的 Java 程序员,竟然回答不出这个问题?说“Dubbo注册中心挂了, 服务之间还可以继续通信吗”?今天,我话2分钟时间给大家来聊一聊。
188 0
|
2月前
|
并行计算 Java API
深入理解Java多线程编程:创建、状态管理、同步与通信
深入理解Java多线程编程:创建、状态管理、同步与通信
|
7月前
|
网络协议 Java
Java UDP通信详解
UDP(User Datagram Protocol)是一种无连接的网络传输协议,它不像TCP那样需要建立连接和维护状态,因此更加轻量级。UDP适用于那些对数据传输的实时性要求较高,可以容忍一定数据丢失的场景。本文将详细介绍Java中如何使用UDP协议进行网络通信,包括UDP套接字、数据传输、服务器和客户端的创建等。
128 0
|
4月前
|
C#
C# | 极简代码实现串口通信,功能超丰富 (使用BytesIO通信库)
C# 极简代码实现串口通信,功能超丰富 安装NuGet库 程序截图 事件监听 设计及实现 界面 代码 源码下载
59 0
C# | 极简代码实现串口通信,功能超丰富 (使用BytesIO通信库)
|
4月前
|
传感器 监控 网络协议
C# | 上位机开发新手指南(二)上位机通信
在上位机开发中,串口通信和TCP通信是两种常见的通信方式。串口通信是指通过串口将数据发送和接收到控制器或其他外设中,TCP通信则是通过网络将数据传输到远程设备中。下面介绍一下为什么学习串口通信和TCP通信在上位机开发中是很重要的。
159 0
C# | 上位机开发新手指南(二)上位机通信