亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

簡析JavaRMI與.NETRemoting

2019-11-18 16:25:59
字體:
來源:轉載
供稿:網友

  java與.NET都提供了遠程處理功能,但不完全相同.Java遠程處理是通過一個“共享接口”實現的,而.NET可以通過一個“共享命令集”實現。下面就這兩種方式來具體說明。

Java 遠程處理

Java遠程方法調用(RMI)提供了Java程序語言的遠程通訊功能,這種特性使客戶機上運行的程序可以調用遠程服務器上的對象,使Java編程人員能夠在網絡環境中分布操作。
創建一個簡單的Java分布式遠程方法調用程序可以按以下幾個步驟操作,

一、定義遠程接口:
在 Java 中,遠程對象是實現遠程接口的類的實例, 遠程接口聲明每個要遠程調用的方法。在需要創建一個遠程對象的時候,我們通過傳遞一個接口來隱藏基層的實施細節,客戶通過接口句柄發送消息即可。
遠程接口具有如下特點:
1) 遠程接口必須為public屬性。如果不這樣,除非客戶端與遠程接口在同一個包內,否則 當試圖裝入實現該遠程接口的遠程對象時,調用會得到錯誤結果。
2) 遠程接口必須擴展接口java.rmi.Remote。
3) 除與應用程序本身特定的例外之外,遠程接口中的每個方法都必須在自己的throws從句中 聲明java.rmi.RemoteException。(或 RemoteException 的父類)。
4) 作為參數或返回值傳遞的一個遠程對象(不管是直接,還是本地對象中嵌入)必須聲明為遠 程接口,而不應聲明為實施類。
下面是遠程接口的接口RmiSample的定義

import java.rmi.*;
public interface RmiSample extends Remote {
     public int sum(int a,int b) throws RemoteException;
}

二、實現遠程接口:
遠程對象實現類必須擴展遠程對象java.rmi.UnicastRemoteObject類,并實現所定義的遠程接口。遠程對象的實現類中包含實現每個遠程接口所指定的遠程方法的代碼。這個類也可以含有附加的方法,但客戶只能使用遠程接口中的方法。因為客戶是指向接口的一個句柄,而不是它的哪個類。必須為遠程對象定義構造函數,即使只準備定義一個默認構造函數,用它調用基礎類構造函數。因為基礎類構造函數可能會拋出 java.rmi.RemoteException,所以即使別無它用必須拋出java.rmi.RemoteException例外。
以下是遠程對象實現類的聲明:

  import java.rmi.*;
  import java.rmi.server.*;
  public class RmiSampleImpl extends UnicastRemoteObject
                           implements RmiSample {
      RmiSampleImpl() throws RemoteException {
         super();
      }
      public int sum(int a,int b) throws RemoteException {
         return a + b;
      }
  }

三、編寫服務器類:
包含 main 方法的類可以是實現類自身,也可以完全是另一個類。下面通過RmiSampleServer 來創建一個遠程對象的實例,并通過java.rmi.registry.LocateRegistry類的createRegistry 方法從指定端口號啟動注冊服務程序,也可以通過執行 rmiregistry 命令啟動注冊服務程序,注冊服務程序的缺省運行端口為 1099。必須將遠程對象名字綁定到對遠程對象的引用上: Naming.rebind("http://localhost:8808/SAMPLE-SERVER" , Server);
以下是服務器類的聲明:

import java.rmi.*;
import java.rmi.registry.*;
public class RmiSampleServer{
     public static void main(String args[]) {
         try {
         LocateRegistry.createRegistry(8808) ;
         SampleServerImpl Server = new SampleServerImpl();
         // 將該對象實例與名稱“SAMPLE-SERVER”捆綁
         Naming.rebind("http://localhost:8808/SAMPLE-SERVER" , Server);
         } catch (java.net.MalformedURLException me) {
            System.out.         } catch (RemoteException re) {
            System.out.println("Remote exception: " + re.toString());
         }
     }
  }

四、編寫使用遠程服務的客戶機類:
客戶機類的主要功能有兩個,一是通過Naming.lookup方法來構造注冊服務程序 stub 程序實例,二是調用服務器遠程對象上的遠程方法。
以下是服務器類的聲明:

import java.rmi.*;
import java.rmi.server.*;
public class RmiSampleClient {
     public static void main(String[] args)
     {
         try {
            String url = "http://localhost:8808/SAMPLE-SERVER";
            RmiSample RmiObject = (RmiSample)Naming.lookup(url);
            System.out.println(" 1 + 2 = " + RmiObject.sum(1,2) );
         } catch (RemoteException exc) {
             System.out.println("Error in lookup: " + exc.toString());
         } catch (java.net.MalformedURLException exc) {
             System.out.println("Malformed URL: " + exc.toString());
         } catch (java.rmi.NotBoundException exc) {
             System.out.println("NotBound: " + exc.toString());
         }
      }
   }

五、編譯代碼:
要編譯 Java 源文件,請運行 javac 命令:
javac RmiSample.java RmiSampleImpl.java RmiSampleServer.java RmiSampleClient.java

六、為遠程對象實現創建根和干:
要創建存根程序和骨架文件,應以包含遠程對象實現的已編譯類包全名運行 rmic 編譯器。
存根(Stub)是遠程對象在客戶端的代理,它將RMI調用傳遞給服務器端的骨架(Skeleton),后者負責將該調用傳遞給實際的遠程方法輸入如下:
D:/RMI>rmic -d D:/RMI RmiSampleImpl 執行這個命令, 若rmic成功運行,RMI目錄下就會多出兩個新類: RmiSampleImpl_Stub.class RmiSampleImpl_Skel.class 它們分別對應的是存根(stub)和骨架(skeleton).

七、運行代碼:
運行服務端程序:在Windows下,輸入下列命令,在后臺啟動RmiSampleServer程序:
D:/RMI>java RmiSampleServer
運行客戶端程序:
D:/RMI>java RmiSampleClient
客戶端輸出: 1 + 2 = 3

.NET 遠程處理。

微軟的.NET Remoting提供了一種允許對象通過應用程序域與另一對象進行交互的框架,從結構上而言,.NET Remoting對象非常適合通過網絡訪問資源,而又無需處理由基于SOAP的WebServices所帶來的難題。下面介紹創建一個簡單的.NET Remoting分布式遠程方法調用程序一般所需要的幾個步驟。

第一步:創建共享遠程對象

創建一個C# Library,并將其命名為RemoteObject。這將創建一個我們的.NET Remote客戶端和服務器端用來通訊的“共享命令集”。
public class RemoteObject : System.MarshalByRefObject
{
     public RemoteObject()
     {
        System.Console.WriteLine("New Referance Added!");
     }

     public int sum(int a, int b)
     {
        return a + b;
     }
}
名字空間是對象所需要的。請記住,如果得到System.Runtime.Remoting.Channels.Tcp名字空間不存在的信息,請檢查是否象上面的代碼那樣添加了對System.Runtime.Remoting.dll的引用。

using System;
using System.Runtime;

我們為對象使用的名字空間是RemoteSample,下面的對象是MarshalByRefObject,在其中我們創建了一個引用和包括服務器端操作全部完成所需要的所有工作。

namespace RemoteSample
{
public class RemoteObject : System.MarshalByRefObject
{
    public RemoteObject()
    {
       System.Console.WriteLine("New Referance Added!");
    }

    public int sum(int a, int b)
    {
       return a + b;
    }
}
}//RemoteSample名字空間結束

保存文件,命名為RemoteObject.cs
用命令行csc /t:library RemoteObject.cs 編譯文件,就會得到一個RemoteObject.DLL文件,并可以在編譯其他的C#文件中使用它。

第二步:創建服務器對象

創建服務器對象,并將它命名為RemoteServer。在創建服務器對象時必須實現以下操作:

1)構造服務器信道。
TcpServerChannel是.NET remoting支持的二種信道類型中的一種,可以將它設置為對象對來自哪一個端口的請求進行回應,ChannelServices.RegisterChannel將把該端口號與
操作系統中的TCP/ip棧綁定。

TcpServerChannel channel = new TcpServerChannel(8808);
ChannelServices.RegisterChannel(channel);

也可以設置為另一種的信道類型HTTP,只要簡單地用System.Runtime.Remoting.Channels.Http名字空間中的HttpServerChannel對象替換即可。使用HTTP和TCP信道之間的區別在于:如果應用程序是在局域網上運行,則最好使用TCP信道,因為它的性能要好于HTTP信道;如果應用程序是在互聯網上運行,則有時候根據防火墻的配置,HTTP是唯一的選擇。需要記住的是,如果使用了防火墻軟件,則防火墻應該配置成允許TCP數據流量通過你為對象選擇的端口。

2)將服務端上的對象 Type 注冊為已知類型。
RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteObject),
"RemoteObject", WellKnownObjectMode.SingleCall);
這行代碼設置了服務中的一些參數和把欲使用的對象名字與遠程對象進行綁定,第一個參數是綁定的對象,第二個參數是TCP或HTTP信道中遠程對象名字的字符串,第三個參數讓容器知道,當有對對象的請求傳來時,應該如何處理對象。盡管WellKnownObjectMode.SingleCall對所有的調用者使用一個對象的實例,但它為每個客戶生成這個對象的一個實例。如果用WellKnownObjectMode.SingleCall則每個傳入的消息由同一個對象實例提供服務。

完整的對象代碼如下所示:
using System; using System.Runtime;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using RemoteSample;
namespace RemoteSampleServer
{
  public class RemoteServer
  {
      public static void Main(String[] args)
      {
         TcpServerChannel channel = new TcpServerChannel(8808);
         ChannelServices.RegisterChannel(channel);
         RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteObject),
                                  "RemoteObject", WellKnownObjectMode.SingleCall);
         System.Console.WriteLine("Press Any Key");
         System.Console.ReadLine();
       }
   }
}
保存文件,命名為RemoteServer.cs
用命令行csc /r:System.Runtime.Remoting.dll /r:RemoteObject.dll RemoteServer.cs 編譯這一程序生成的RemoteServer.EXE文件。

第三步:創建Remote客戶端程序
創建服務器對象,并將它命名為RemoteClient。在創建服務器對象時首先創建了一個TCP客戶端信道,該信道并不是綁定在一個端口上的;其次獲取一個對遠程的RemoteObject對象的引用。 Activator.GetObject方法返回一個對象類型的值,我們隨后會將它返回的值賦予RemoteObject。我們傳給它的參數與在服務器對象中傳遞給RemotingConfiguration的參數非常地相似,第一個參數是對象類型的,第二個參數是遠程對象的URI。

ChannelServices.RegisterChannel(new TcpClientChannel());
RemoteObject remoteobj = (RemoteObject)Activator.GetObject( typeof(RemoteObject),
                       "tcp://localhost:8808/RemoteObject");

RemoteClient的全部代碼如下所示:

using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using RemoteSample;
namespace RemoteSampleClient
{
  public class RemoteClient
  {
     public static void Main(string[] args)
     {
        ChannelServices.RegisterChannel(new TcpClientChannel());
        RemoteObject remoteobj = (RemoteObject)Activator.GetObject( typeof(RemoteObject),
                           "tcp://localhost:8808/RemoteObject");
        Console.WriteLine("1 + 2 = " + remoteobj.sum(1,2).ToString());
        Console.ReadLine();//在能夠看到結果前不讓窗口關閉
     }

   }
}

保存文件,命名為RemoteClient.cs
用命令行csc /r:System.Runtime.Remoting.dll /r:RemoteObject.dll RemoteClient.cs 編譯這一程序生成的RemoteClient.EXE文件。

第四步:測試
在windows中運行Server.exe,然后打開另一個窗體運行Client.exe。
如果一切正常的話,客戶端輸出: 1 + 2 = 3。

由此可見,NET Remoting不需要創建存根程序和骨架文件,使用起來比Java的RMI簡單,而且為處理局域網甚至互聯網范圍內的資源提供了一個絕佳的方法,使用范圍比Java的RMI更廣泛。進入討論組討論。

(出處:http://www.49028c.com)



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
色综合伊人色综合网| 国产乱肥老妇国产一区二| 欧美黄网免费在线观看| 精品久久中文字幕久久av| 午夜精品久久久久久久99黑人| 亚洲性夜色噜噜噜7777| 色偷偷偷亚洲综合网另类| 日韩精品欧美国产精品忘忧草| 成人性生交xxxxx网站| 久久99国产综合精品女同| 日韩在线视频观看正片免费网站| 日韩电影中文字幕| 国产亚洲精品激情久久| 久久久国产精品亚洲一区| 日韩中文字幕在线精品| 亚洲老头同性xxxxx| 国产色婷婷国产综合在线理论片a| 欧美精品免费播放| 欧美色道久久88综合亚洲精品| 色婷婷亚洲mv天堂mv在影片| 欧美激情精品久久久久久| 国产精品男人的天堂| 久久琪琪电影院| 国产精品白丝jk喷水视频一区| 91精品视频免费观看| 国产精品久久一区| 国产精品亚洲欧美导航| 亚洲电影av在线| 精品国内亚洲在观看18黄| 国产精品99久久久久久白浆小说| 在线电影欧美日韩一区二区私密| 国内精品久久久久久久| 欧美中文字幕在线播放| 国产999精品视频| 91精品国产高清久久久久久91| 在线观看免费高清视频97| 国产精品高潮呻吟视频| 日韩高清人体午夜| 日韩在线不卡视频| 91丨九色丨国产在线| 亚洲一区二区三区xxx视频| 欧美专区在线观看| 久久视频在线观看免费| 亚洲一区二区三区视频| 92福利视频午夜1000合集在线观看| 狠狠色香婷婷久久亚洲精品| 亚洲国产成人在线播放| 亚洲精品一区中文字幕乱码| 亚洲成人久久久| 亚洲激情在线观看| 色偷偷av一区二区三区| 亚洲天堂av女优| 亚洲国产97在线精品一区| 国产精品美乳一区二区免费| 成人亚洲综合色就1024| 国产精品国语对白| 欧美自拍视频在线观看| 欧美精品videossex88| 日韩精品在线免费| 国产精品久久久久久亚洲调教| 精品国产一区二区三区久久| 国产精品自拍偷拍| 国产一区二区三区在线免费观看| 亚洲午夜未删减在线观看| 成人午夜激情免费视频| 久久精品国产成人精品| 国产成一区二区| 55夜色66夜色国产精品视频| 日韩在线观看免费高清完整版| 日韩在线视频一区| 最近中文字幕日韩精品| 亚洲aa在线观看| 91精品久久久久久综合乱菊| 国产精品女人网站| 国产精品国产三级国产专播精品人| 日韩电影中文字幕av| 亚洲福利视频二区| 国产97色在线| 欧美激情欧美狂野欧美精品| 亚洲欧美国产精品久久久久久久| 中文字幕日韩精品在线观看| 欧美激情精品久久久| 亚洲国产99精品国自产| 欧美大片免费观看在线观看网站推荐| 亚洲国产古装精品网站| 91老司机精品视频| 亚洲精品在线视频| 欧美精品免费在线| 欧美日韩国产精品一区二区不卡中文| 日韩精品高清视频| 日韩中文字在线| 久久精品色欧美aⅴ一区二区| 欧美日韩国产一中文字不卡| 一区二区三区日韩在线| 日韩综合中文字幕| 国产精品va在线| 国产精品一二三视频| 国产美女久久精品香蕉69| 亚洲成人av在线| 亚洲欧美一区二区精品久久久| 亚洲人成免费电影| 另类美女黄大片| 亚洲欧美制服丝袜| 亚洲激情第一页| 亚洲精品视频在线观看视频| 欧美午夜精品久久久久久浪潮| 色婷婷av一区二区三区久久| 亚洲国产精品久久91精品| 国产一区二区美女视频| 国产精品扒开腿做爽爽爽男男| 成人在线观看视频网站| 伊人男人综合视频网| 深夜成人在线观看| 亚洲免费视频观看| 亚洲欧洲成视频免费观看| 国产午夜精品美女视频明星a级| 久久91超碰青草是什么| 国产精品视频99| 久久99国产精品久久久久久久久| 亚洲丝袜在线视频| 亚洲国产91色在线| 亚洲精品乱码久久久久久金桔影视| 国产精品高潮呻吟视频| 91精品国产成人| 亚洲韩国日本中文字幕| 欧美日韩免费网站| 国产欧美一区二区| 欧美视频中文在线看| 91精品国产91久久久久久不卡| 秋霞午夜一区二区| 日本久久久a级免费| 色综合视频一区中文字幕| 国产自产女人91一区在线观看| 久久精品精品电影网| 77777少妇光屁股久久一区| 欧美怡春院一区二区三区| 日本精品久久电影| 亚洲精品v欧美精品v日韩精品| 欧美亚洲免费电影| 久久视频在线视频| 亚洲免费一在线| 色小说视频一区| 日韩欧美成人区| 精品国偷自产在线视频99| 成人黄色av免费在线观看| 国内精品国产三级国产在线专| 亚州av一区二区| 98精品国产自产在线观看| 成人网在线免费看| 中文字幕亚洲色图| 国产精品爱久久久久久久| 欧美日韩国产二区| 亚洲国语精品自产拍在线观看| 黄色精品一区二区| 欧美精品18videos性欧| 夜夜嗨av一区二区三区四区| 久久久精品视频在线观看| 精品国产一区二区三区四区在线观看| 久久久久久久久久久国产| 精品国产福利在线| 中文字幕亚洲一区二区三区| 成人国产精品色哟哟| 最近免费中文字幕视频2019| 中文字幕在线日韩|