热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

分布式开发的历史利用Remote方式调用远程对象实现服务器与客户端之间通讯是一种常用的网络开发方式,在.NET与JAVA开发当中,对Remote远程对象早已有着足够的支持(对R

分布式开发的历史

利用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的引用在转换时将变为对应的包。

[c-sharp] view plaincopy
  1. using System;  
  2. namespace Model  
  3. {  
  4.     [Serializable]  
  5.     public class Person  
  6.     {  
  7.         public int ID  
  8.         {  
  9.             get;  
  10.             set;  
  11.         }  
  12.         public string Name  
  13.         {  
  14.             get;  
  15.             set;  
  16.         }  
  17.         public int Age  
  18.         {  
  19.             set;  
  20.             get;  
  21.         }  
  22.     }  
  23. }  

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

[c-sharp] view plaincopy
  1. using System;  
  2. using Model;  
  3. using System.IO;  
  4. using System.Runtime.Serialization.Formatters.Binary;  
  5. using System.Collections.Generic;  
  6. namespace Manager  
  7. {  
  8.     public class PersonManager  
  9.     {  
  10.         /// 虚拟数据源  
  11.         private List DataSource()  
  12.         {  
  13.             FileStream fileStream = new FileStream("./DataSource.sour", FileMode.Open, FileAccess.ReadWrite);  
  14.             BinaryFormatter formatter = new BinaryFormatter();  
  15.             List persOnList=(List)formatter.Deserialize((fileStream));  
  16.               
  17.             return personList;  
  18.         }  
  19.         //获取所有的Person  
  20.         public List GetList()  
  21.         {  
  22.             List personList = DataSource();  
  23.             return personList;  
  24.         }  
  25.         //根据输入ID获取对应的Person  
  26.         public Person GetPersonByID(int id)  
  27.         {  
  28.             foreach (Person person in DataSource())  
  29.             {  
  30.                 if (person.ID == id)  
  31.                     return person;  
  32.             }  
  33.             return null;  
  34.         }  
  35.     }  
  36. }  

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

[xhtml] view plaincopy
  1. xml version="1.0" encoding="utf-8" ?>  
  2. <configuration>  
  3.   <configSections>  
  4.     <sectionGroup name="jnbridge">  
  5.       <section name="dotNetToJavaConfig"  
  6.           type="System.Configuration.SingleTagSectionHandler"/>  
  7.       <section name="javaToDotNetConfig"  
  8.           type="System.Configuration.SingleTagSectionHandler"/>  
  9.       <section name="tcpNoDelay"  
  10.           type="System.Configuration.SingleTagSectionHandler"/>  
  11.       <section name="javaSideDeclarations"  
  12.           type="System.Configuration.NameValueSectionHandler"/>  
  13.       <section name="assemblyList"  
  14.           type="com.jnbridge.jnbcore.AssemblyListHandler, JNBShare"/>  
  15.     sectionGroup>  
  16.   configSections>  
  17.   <jnbridge>  
  18.     <dotNetToJavaConfig scheme="jtcp" host="localhost" port="8085"/>  
  19.       
  20.     <javaToDotNetConfig scheme="jtcp" port="8086"/>  
  21.       
  22.     <assemblyList>  
  23.       <assembly file="./Model.dll"/>  
  24.       <assembly file="./Manager.dll"/>  
  25.     assemblyList>  
  26.   jnbridge>  
  27. configuration>  

最后启动服务

[c-sharp] view plaincopy
  1. using System;  
  2. using com.jnbridge.jnbcore;  
  3. namespace NET_Service  
  4. {  
  5.     class Program  
  6.     {  
  7.         static void Main(string[] args)  
  8.         {  
  9.               
  10.             Console.WriteLine(".NET Start!");  
  11.             //启动.NET端服务,注意必须添加对JNBShare的引用,才可使用com.jnbridge.jnbcore.DotNetSide  
  12.             DotNetSide.startDotNetSide();  
  13.             Console.ReadKey();  
  14.             //关闭.NET端服务  
  15.             DotNetSide.stopDotNetSide();  
  16.         }  
  17.     }  
  18. }  

生成转换层代码

打开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。

[java] view plaincopy
  1. package com.jnbridge.javaclient;  
  2. import com.jnbridge.jnbcore.*;  
  3. import System.Collections.Generic.*;     
  4. //引用Proxy.jar包内System.Collection.Generice.*空间里面的代理类  
  5. import Manager.*;  
  6. import Model.*;  
  7. public class Test {  
  8.     /** 
  9.      * @param args 
  10.      */  
  11.     public static void main(String[] args) {  
  12.         // TODO Auto-generated method stub  
  13.         try{  
  14.         //注册JNBridge的TCP配置文件jnbcore_tcp.properties  
  15.         DotNetSide.init("E://Java Projects//JNBridge JAVA//JAVA Client//bin//jnbcore_tcp.properties");  
  16.           
  17.         PersonManager persOnManager=new PersonManager();  
  18.         //注意此List_1是Proxy.jar包内System.Collections.Generic.List的代理类,而并非JDK内自带的List类  
  19.         List__1 persOnList=personManager.GetList();  
  20.         if(personList.Get_Count()!=0){  
  21.             //注意此Get_Count()方法是Proxy.jar包内System.Collections.Generic.List代理类的GetCount()方法  
  22.             for(int n=0;n
  23.                 Person person=(Person)personList.Get_Item(n);  
  24.                 System.out.println("Id:"+person.Get_ID()+" Age:"+person.Get_Age()+" Name:"+person.Get_Name());    
  25.             }  
  26.         }  
  27.         }catch(Exception ex){  
  28.             ex.printStackTrace();  
  29.         }  
  30.     }  
  31. }  

完成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桥接模式实现远程通讯

对JAVA与.NET开发有兴趣的朋友欢迎加入QQ群:59557329 ,

cnblogs博客园:http://www.cnblogs.com/leslies2/
csdn博客:http://blog.csdn.net/leslies2
原创作品,转载时请注明作者及出处
 
原文:http://blog.csdn.net/leslies2/article/details/6457363

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

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


推荐阅读
  • 优化Nginx中PHP-FPM模块配置以提升性能
    通过调整Nginx与PHP-FPM之间的配置,可以显著提高Web服务器处理PHP请求的速度和效率。本文将详细介绍如何针对不同的应用场景优化PHP-FPM的各项关键参数。 ... [详细]
  • Hibernate入门指南:单表数据库操作详解
    本文介绍了Hibernate作为全面的ORM框架的基础知识,并详细讲解了在MyEclipse环境中配置Hibernate以及进行基本的数据库单表操作的方法,包括增删改查等常见操作。 ... [详细]
  • 浏览器、中间件与服务器的交互机制
    本文详细探讨了浏览器、中间件和服务器之间的交互过程,特别是HTTP请求的完整流程,包括DNS解析、TCP连接建立及数据传输等关键步骤。 ... [详细]
  • 本文介绍了FTP(文件传输协议)的基础知识,包括其定义、如何通过TCP建立控制和数据连接,以及主动模式与被动模式的区别。FTP作为一种重要的文件传输协议,在互联网数据交换中扮演着关键角色。 ... [详细]
  • 基于HoG和SVM的人体检测技术解析
    近期深入研究了使用HoG(梯度方向直方图)与SVM(支持向量机)进行人体检测的技术。通过阅读大量文献,特别是Dalal等先驱者的著作,我对HoG算法有了较为深刻的理解,并在此基础上探讨了如何将其应用于实际场景。 ... [详细]
  • 本文介绍了在使用SQL Server的数据库邮件功能时,如何处理因文件附件或查询结果过大而导致的错误,并提供了解决方案。 ... [详细]
  • 如何清空Layui树结构
    本文将详细介绍如何使用Layui框架清空树形结构,包括创建树、添加节点以及实现清空功能的具体步骤。通过本文,您将能够掌握Layui树的管理技巧。 ... [详细]
  • HTML5 拖拽功能实现
    本文通过一个简单的示例,展示了如何利用 HTML5 的拖放 API 实现元素之间的拖拽功能。示例包括 HTML 结构、CSS 样式以及 JavaScript 逻辑,旨在帮助开发者快速理解和应用拖拽技术。 ... [详细]
  • 本文介绍了如何利用JavaScript实现学生信息表的动态添加和删除行功能。 ... [详细]
  • 本文探讨了在JavaScript中如何有效地从服务器控件DropDownList中获取绑定的ID值,而非仅仅是显示的文本值。这对于需要根据用户选择动态处理数据的应用场景非常有用。 ... [详细]
  • 2023年PHP处理请求超时的全面指南
    本文详细介绍了在PHP中处理请求超时的各种方法,包括设置脚本执行时间、处理file_get_contents函数超时以及优化AJAX请求等,适合开发者参考学习。 ... [详细]
  • TunnelWarfareTimeLimit:1000MS MemoryLimit:131072KTotalSubmissions:7307 ... [详细]
  • 电子与正电子的相互作用
    本文探讨了电子与正电子之间的基本物理特性及其在现代物理学中的应用,包括它们的产生、湮灭过程以及在粒子加速器和宇宙射线中的表现。 ... [详细]
  • 深入理解SAP Fiori及其核心概念
    本文详细介绍了SAP Fiori的基本概念、发展历程、核心特性、应用类型、运行环境以及开发工具等,旨在帮助读者全面了解SAP Fiori的技术框架和应用场景。 ... [详细]
  • 华为交换机VLAN间通信配置指南
    本文详细介绍了如何在华为交换机上配置VLAN间的通信,包括VLAN的创建、VLAN接口的配置以及Trunk和Access端口的设置。通过具体步骤指导读者完成网络配置,确保不同VLAN之间的设备能够互相访问。 ... [详细]
author-avatar
雨含的晴天
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有