JAVA与.NET的相互调用——利用JNBridge桥接模式实现远程通讯

分布式开发的历史

利用Remote方式调用远程对象实现服务器与客户端之间通讯是一种常用的网络开发方式,在.NET与JAVA开发当中,对Remote远程对象早已有着足够的支持(对Remote远程对象调用有兴趣的朋友欢迎参考一下利用远程对象实现分布式开发)。

从2003年开始.NET当中就盛传着.NET Remoting远程对象调用的分布式开发,.NET Remoting主要用于管理跨应用程序域的同步和异步RPC 会话。在默认情况下,Remoting可以使用 HTTP 或 TCP 协议进行信息通讯,并使用 XML 编码的 SOAP 或二进制消息格式进行数据交换。.NET Remoting 提供了非常灵活和可扩展的编程框架,并且可以管理对象的状态。在Framewok2.0出台以后,WCF盛世登场,它是综合了.NET Remoting远程对象,TCP/IP套接字,Web服务,MSMQ,P2P点对点等各类型通信方式的产物,WCF使远程通信进入另一个台阶。

而在JAVA方面,对远程通信也有强大的支持,它定义了的RPC(Remote Procedure Call Protocol)协议是—项远程过程调用协议,它可以通过网络从远程计算机请求的服务获得计算结果,它无需了解底层网络技术的协议就可以使用如TCP或UDP等通信方式,为程序之间传递信息数据。在网络通信模型中,RPC跨越了传输层和应用层。RPC使系统更容易地实现分布式式开发。但RPC通讯却并未实现面向对象的开发原则,到而RMI(Remote Method Invocation)远程方法调用是一种计算机之间利用远程对象互相调用实现通讯的一种机制。它以面向对象的开发方式,利用RPC协议,使服务器与客户端的对象能够实现远程调用。

但在.NET Remoting与RMI通信中同时存在一个弊端,那就是对开发语言的限制,无论是使用哪一种通讯方式,服务器与客户端都必须支持同一种开发语言。通讯过程中不能跨越开发语言的限制,这是一个人令人懊恼的消息。因为在大型的开发项目当中,往往会集合着不同语言开发进行不同模块的开发。而使用Remote进行分布式开发,可以提高通信的效率但却又受到限制。对此,各大开发公司做出了积极的贡献,开发出如J-Integra(又名Ja.NET),IIOP.NET(Internet Inter-Orb Protocol),JNBridge等集成开发工具,对.NET与JAVA之间实现Remote远程对象的相互调用作出足够的支持。下面在下为大家对“JNBridge实现.NET与JAVA的相互操作”作出详细的介绍。

JNBridge概述

JNBridge是一种领先的JAVA与.NET互操作的的产品,凭借JNBridge技术,Java和.NET代码无需交叉编译器就可以实现对象共享。所有Java代码运行在JVM上,而.NET代码则运行在CLR上。在该方案下,JVM和CLR可以运行在不同的机器上,也可以运行在一台机器的不同进程上,甚至还能运行在相同的进程的不同应用程序域上。经历多年的发展,JNBridge已经发布了JNBridgePro 5.0,JNBridgePro 5.0有着更强大的功能。

  1. 支持ava和.NET之间的跨平台事务;
  2. 支持Microsoft Visual Studio和Eclipse插件;
  3. 兼容Windows 7;
  4. 跨平台交易一体化主要是对用户透明;
  5. ‘回滚‘- 任何一方的终止都将导致双方的行动被回滚;

JNBridge支持.NET To Java ,Java To .NET两种服务方式,并可以行用TCP、HTTP、SOAP等多个协议进行双方通讯,下面就以 “JAVA调用.NET” 实现一个简单开发例子,介绍一下JNBridge的功能。

JNBridge配置

首先可以在JNBridge的官方网站http://www.jnbridge.com/downloads.htm 下载程序,安装JNBridgePro 5.0后,启动JNBProxy v5.1.exe,选择Create new Java->.NET Project,新建一个项目后,点击Project->Java Options对系统进行配置。首先设置好本机的java.exe应用程序和jvm.dll程序集的路径,然后设置jnbcore.jar和bcel.jar的路径(在5.1版本中,这两个文件存在于“/JNBridge/JNBridgePro v5.1/jnbcore/”),最后可以选择HTTP或TCP通讯方式(在此例子当中在下选择TCP通讯,系统默认接口为8085你也可以选择自定义的接口)。点击“OK”按钮,配置完成时,系统将自动生成一个 "/JNBridge/JNBridgePro v5.1/jnbcore/jnbcore_tcp.properties" 文件记录TCP配置信息。

.NET服务端开发

假如阁下使用的是Visual Studio 2008或者Visual Studio 2010版本,系统将会感知JNBridge的存在,在新建项目时,可以直接新建一个DotNetJavaProxies项目。在此在下想展示一下JNBridge的转换性能,所以直接新一个解决方案。添加一个Model项目,加入Person类,为Person加入Serializable特性,注意要去除不必要的引用,因为对Framework的引用在转换时将变为对应的包。

using System;

namespace Model
{
[Serializable]
publicclass Person
{
publicint ID
{
get;
set;
}

publicstring Name
{
get;
set;
}

publicint Age
{
set;
get;
}
}
}

添加一个Manager项目,加入PersonManager类,在测试时,只是把虚拟数据放在DataSource.sour文件中。

using System;
using Model;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Collections.Generic;

namespace Manager
{
publicclass PersonManager
{
/// 虚拟数据源
private List<Person> DataSource()
{
FileStream fileStream =new FileStream("./DataSource.sour", FileMode.Open, FileAccess.ReadWrite);
BinaryFormatter formatter =new BinaryFormatter();
List<Person> personList=(List<Person>)formatter.Deserialize((fileStream));

return personList;
}

//获取所有的Person
public List<Person> GetList()
{
List<Person> personList = DataSource();
return personList;
}

//根据输入ID获取对应的Person
public Person GetPersonByID(int id)
{
foreach (Person person in DataSource())
{
if (person.ID == id)
return person;
}
returnnull;
}
}
}

添加一个ConsoleApplication作为启动项目,在项目中添加对JNBShare.dll的引用(文件路径 “\JNBridge\JNBridgePro v5.1\4.0-targeted”),然后添加配置文件

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<sectionGroup name="jnbridge">
<section name="dotNetToJavaConfig"
type="System.Configuration.SingleTagSectionHandler"/>
<section name="javaToDotNetConfig"
type="System.Configuration.SingleTagSectionHandler"/>
<section name="tcpNoDelay"
type="System.Configuration.SingleTagSectionHandler"/>
<section name="javaSideDeclarations"
type="System.Configuration.NameValueSectionHandler"/>
<section name="assemblyList"
type="com.jnbridge.jnbcore.AssemblyListHandler, JNBShare"/>
</sectionGroup>
</configSections>
<jnbridge>
<dotNetToJavaConfig scheme="jtcp" host="localhost" port="8085"/>
<!--注意通讯接口必须与JNBridge中配置的接口一致-->
<javaToDotNetConfig scheme="jtcp" port="8086"/>

<!-- 注册共用程序集 -->
<assemblyList>
<assembly file=".\Model.dll"/>
<assembly file=".\Manager.dll"/>
</assemblyList>
</jnbridge>
</configuration>

最后启动服务

using System;
using com.jnbridge.jnbcore;

namespace NET_Service
{
class Program
{
staticvoid Main(string[] args)
{
Console.WriteLine(".NET Start!");
//启动.NET端服务,注意必须添加对JNBShare的引用,才可使用com.jnbridge.jnbcore.DotNetSide
DotNetSide.startDotNetSide();
Console.ReadKey();
//关闭.NET端服务
DotNetSide.stopDotNetSide();
}
}
}

生成转换层代码

打开JNBridge,选择工具栏 "Add class from assembly files",分别加入Model.dll,Manager.dll及mscorlib.dll(此程序集存在于“C:\Windows\Microsoft.NET\Framework\v4.0.30319\”,里面包含System,System.Collections,System.IO等等重要的命名空间)

在选择必要的类以后,按下“Project->Build",系统就会对应选择把.NET里面的类生成对class放入Proxy.jar代理包。

Java端开发

新建一个Java项目,引用刚生成的代理包Proxy.jar,还有jnbcore.jar、bcel-5.1-jnbridge.jar(在5.1版本中,这两个文件存在于“/JNBridge/JNBridgePro v5.1/jnbcore/”),把JNBridge的TCP配置文件jnbcore_tcp.properties复制到bin文件夹内,开发一个测试端。值得注意的是在生成Proxy.jar代码包的时候,必须对System.Collections.Generic,System.String等等这些常用类的空间添加引用,否则,在Java里面就无法调用.NET里面的System.Collections.Generic.List等这些常用类。由于在Java里面对像List这些常用的类具有类名之间的冲突,所以在Proxy里面会对System.Collections.Generic.List这些类命名为System.Collections.Generic.List_1。

package com.jnbridge.javaclient;

import com.jnbridge.jnbcore.*;

import System.Collections.Generic.*; 
//引用Proxy.jar包内System.Collection.Generice.*空间里面的代理类

import Manager.*;
import Model.*;

publicclass Test {

/**
* @param args
*/
publicstaticvoid main(String[] args) {
// TODO Auto-generated method stub
try{
//注册JNBridge的TCP配置文件jnbcore_tcp.properties
DotNetSide.init("E:\\Java Projects\\JNBridge JAVA\\JAVA Client\\bin\\jnbcore_tcp.properties");

PersonManager personManager=new PersonManager();
//注意此List_1是Proxy.jar包内System.Collections.Generic.List的代理类,而并非JDK内自带的List类
List__1 personList=personManager.GetList();
if(personList.Get_Count()!=0){
//注意此Get_Count()方法是Proxy.jar包内System.Collections.Generic.List代理类的GetCount()方法
for(int n=0;n<personList.Get_Count();n++){
Person person=(Person)personList.Get_Item(n);
System.out.println("Id:"+person.Get_ID()+" Age:"+person.Get_Age()+" Name:"+person.Get_Name()); 
}
}
}catch(Exception ex){
ex.printStackTrace();
}
}
}

完成JAVA端后,先启动.NET服务端,再启动JAVA端,JAVA就会调用到.NET端的数据,屏幕将显示出测试结果:

Id:0 Age:29 Name:Leslie
Id:1 Age:23 Name:Rose
Id:2 Age:22 Name:Jack

在JNBridge官网上有着许多的开发例子,在此不多介绍。对不同开发类型的转换需要调用不同的工具包,各位可以直接参考官网上的教材。

Java与.NET的混合开发模式

在众很多的大型系统开发中,开发工具往往不限制于同一种开发语言,而是会使用多种开发语言的混合型开发。像在开发底层与业务层的过程中,由于.NET只限制工作于Windows系统,而JAVA可以在Windows、Unix、Linux中灵活运用而更受到欢迎。但在开发UI表现层里,很明显像Swing、Applet等开发工具受到的限制更多,而WPF、Siverlight、WinForms等开发工具因为具有成熟的控件与华丽的页面而倍受欢迎。所以使用JAVA来开发底层、业务层与Linux系统的UI层,同时使用.NET来开发Windows系统的UI层的例子很常见。在此开发过程中,利用JNBridge工具生成Proxy代理可以大大降低开发的难度,提高开发效率,使.NET平台与JAVA平台之间实现无缝连接。

综上所述,JNBridge可视为JAVA平台与.NET平台之间通讯的桥梁,上述的例子利用JNBridge现实JAVA与.NET的无缝连接,可以使.NET的客户端无需感知JAVA底层的存在,.NET的UI端直接调用Proxy代理就可以与JAVA端实现通讯,这不失为JAVA与.NET之间互相调用的一种好手段。

源代码下载

相关文章

JAVA与.NET的相互调用——TCP/IP套接字相互调用的基本架构(附原代码)

JAVA与.NET的相互调用——通过Web服务实现相互调用(附原代码)

JAVA与.NET的相互调用——利用JNBridge桥接模式实现远程通讯

时间: 2024-12-25 15:26:22

JAVA与.NET的相互调用——利用JNBridge桥接模式实现远程通讯的相关文章

JAVA与.NET的相互调用——通过Web服务实现相互调用

JAVA与.NET是现今世界竞争激烈的两大开发媒体,两者语言有很多相似的地方.而在很多大型的开发项目里面,往往需要使用两种语言进行集成开发.而很多的开发人员都会偏向于其中一种语言,在使用集成开发的时候对另一种语言感觉到畏惧.在这里在下向各位介绍一下,JAVA与.NET相互调用的例子.下面的介绍主要包括三方面:一是通过常用Web服务进行相互调用,二是使用TCP/IP套接字进行相互调用,三是使用Remote实现远程对象相互调用. 在这章里面先为大家介绍一下最简单,最常用的Web服务相互调用方式.首先

.Net 与 Java 的服务接口相互调用

本文介绍.Net 与 Java 相互调用的例子.下面的介绍主要包括三方面:一是通过常用Web服务进行相互调用,二是使用TCP/IP套接字进行相互调用,三是使用Remote实现远程对象相互调用. 首先说一下Web服务的来源,Web服务是一种新的Web应用程序分支,可以执行从简单的请求到复杂商务处理等任何功能.一旦部署以后,其他Web服务应用程序可以发现并调用它部署的服务. Web Service是一种应用程序,它可以使用标准的互联网协议,像超文件传输协议(HTTP).简单对象访问协议(SOAP).

利用thrift在c++、java和python之间相互调用

转自:http://blog.csdn.net/andy_yf/article/details/7487384 thrift做为跨语言调用的方案有高效,支持语言较多,成熟等优点:代码侵入较强是其弱点. 下面记录以C++做服务器,C++,java和python做客户端的示例,这个和本人现在工作环境吻合,使用多线程长连接的socket来建立高效分布式系统的跨语言调用平台.遗憾的是目前版本(0.7.0)的C语言还不支持Compact协议,导致在现在的环境中nginx c module调用thrift要

两个java工程之间的相互调用方法

如果你有两个java项目的话,如何向他们之间进行信息的通信前提:必须知道要通信的java项目(接收请求方)的服务器的IP地址和访问路径.其实两个java项目之间的通信还是使用HTTP的请求.主要有两种方式:①使用apache的HttpClient方式.②使用JDK自带的java.net包下的HttpURLConnection方式. 这次主要讲解HttpURLConnection方式:HttpURLConnection传递请求常用的有两种方式:POST和GET方式.使用setRequestMeth

java中各个类相互调用资源的原理

当我们要进行跨类的调用/使用的时候,比如当前类调用另一个类中的变量或方法时, 这时需要一定的条件,如果那些将要被调用的变量或方法是static(静态)变量,也叫类变 量,那么可以通过类名调用,相当于此时你有了使用那个类的权限,或者此时那个类中的 变量和方法这些资源对你开放了,可以简单的通过类名直接调用/使用;但是若那个类中没 有用static进行声明,默认是不对外使用的,只有那个类中的对象才可以调用/使用,也就 是说当前类没有权限使用那个类中的资源;这时只有先在本类中创建一个引用对象的变量 ,才

Hybrid App开发模式中, IOS/Android 和 JavaScript相互调用方式

IOS:Objective-C 和 JavaScript 的相互调用 iOS7以前,iOS SDK 并没有原生提供 js 调用 native 代码的 API.但是 UIWebView 的一个 delegate 方法使我们可以做到让 js 需要调用时,通知 native.在 native 执行完相应调用后,可以用stringByEvaluatingJavaScriptFromString 方法,将执行结果返回给 js.这样,就实现了 js 与 native 代码的相互调用.具体让 js 通知 na

java/android 设计模式学习笔记(12)---组合模式

这篇我们来介绍一下组合模式(Composite Pattern),它也称为部分整体模式(Part-Whole Pattern),结构型模式之一.组合模式比较简单,它将一组相似的对象看作一个对象处理,并根据一个树状结构来组合对象,然后提供一个统一的方法去访问相应的对象,以此忽略掉对象与对象集合之间的差别.这个最典型的例子就是数据结构中的树了,如果一个节点有子节点,那么它就是枝干节点,如果没有子节点,那么它就是叶子节点,那么怎么把枝干节点和叶子节点统一当作一种对象处理呢?这就需要用到组合模式了. 转

java/android 设计模式学习笔记(9)---代理模式

这篇博客我们来介绍一下代理模式(Proxy Pattern),代理模式也成为委托模式,是一个非常重要的设计模式,不少设计模式也都会有代理模式的影子.代理在我们日常生活中也很常见,比如上网时连接的代理服务器地址,更比如我们平时租房子,将找房子的过程代理给中介等等,都是代理模式在日常生活中的使用例子. 代理模式中的代理对象能够连接任何事物:一个网络连接,一个占用很多内存的大对象,一个文件,或者是一些复制起来代价很高甚至根本不可能复制的一些资源.总之,代理是一个由客户端调用去访问幕后真正服务的包装对象

Java 远程通讯技术及原理分析

在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在Java领域中有很多可实现远程通讯的技术,例如:RMI.MINA.ESB.Burlap.Hessian.SOAP.EJB和JMS等,这些名词之间到底是些什么关系呢,它们背后到底是基于什么原理实现的呢,了解这些是实现分布式服务框架的基础知识,而如果在性能上有高的要求的话,那深入了解这些技术背后的机制就是必须的了. 1 基本原理 要实现网络机器间的通讯,首先得来看看计算机系统网络通信的基本原理,在底层层面去看,网络通信需要做的就是将流从