JAVA與.NET的相互調用——利用JNBridge橋接模式實現遠程通信

分佈式開發的歷史html

利用Remote方式調用遠程對象實現服務器與客戶端之間通信是一種經常使用的網絡開發方式,在.NET與JAVA開發當中,對Remote遠程對象早已有着足夠的支持(對Remote遠程對象調用有興趣的朋友歡迎參考一下利用遠程對象實現分佈式開發)。java

從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配置jvm

首先能夠在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配置信息。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橋接模式實現遠程通信

相關文章
相關標籤/搜索