国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

ホームページ Java &#&ベース Java RMI の詳細(xì)な図解説明 (例付き)

Java RMI の詳細(xì)な図解説明 (例付き)

Dec 24, 2019 pm 05:33 PM
java

Java RMI の詳細(xì)な図解説明 (例付き)

Java RMI: Java リモート メソッド呼び出し、または Java RMI (Java Remote Method Invocation) は、Java プログラミング言語(yǔ)でリモート プロシージャ コールを?qū)g裝するために使用されるアプリケーション プログラミング インターフェイスです。

これにより、クライアント上で実行されているプログラムがリモート サーバー上のオブジェクトを呼び出すことができるようになります。リモート メソッド呼び出し機(jī)能を使用すると、Java プログラマはネットワーク環(huán)境で操作を分散できます。 RMI の全體の目的は、リモート インターフェイス オブジェクトの使用を可能な限り簡(jiǎn)素化することです。

リモート プロシージャ コール (RPC) を使用すると、あるプロセスが別のプロセス (おそらく別のリモート ホスト上) のプロセスを呼び出すことができ、それによってプロセス分散機(jī)能が提供されることがわかっています。 Java の RMI は、RPC に基づいてさらに一歩前進(jìn)し、分散オブジェクト間の通信を提供します。

RMI (リモート メソッド呼び出し) は、リモート メソッド呼び出しです。これにより、ある Java 仮想マシン上で実行されているオブジェクトが、別の Java 仮想マシン上で実行されているオブジェクトのメソッドを呼び出すことができます。

2 つの仮想マシンは、同じコンピュータ上の異なるプロセスで実行することも、ネットワーク上の異なるコンピュータで実行することもできます。

【JavaRMI】

1. 動(dòng)作原理

RMI を使用すると、Java プログラムがネットワーク上の別のコンピュータを呼び出すことができます。コンピュータの Java オブジェクトのメソッドを呼び出した場(chǎng)合、それを呼び出した場(chǎng)合の効果は、ローカル マシン上で呼び出した場(chǎng)合と同じになります。平たく言えば、マシン A にクラスがあり、マシン B はリモート呼び出しを通じてこのクラスのメソッドを呼び出します。

RMI、リモート メソッド呼び出し (リモート メソッド呼び出し) は、Enterprise JavaBeans のバックボーンであり、分散 Java アプリケーションを構(gòu)築する便利な方法です。 RMI は非常に使いやすいですが、非常に強(qiáng)力です。

RMI の基礎(chǔ)はインターフェイスです。RMI アーキテクチャは、インターフェイスの定義とインターフェイスの特定の実裝の定義は分離されているという重要な原則に基づいています。以下では、具體的な例を使用して、単純なリモート コンピューティング サービスとそれを使用するクライアント プログラムを構(gòu)築します

2. RMI には次のものが含まれます:

1. リモート サービス インターフェイスの定義

2. リモート サービス インターフェイスの特定の実裝

3. スタブ ファイルとスケルトン ファイル

4. リモート サービスを?qū)g行するサーバー

5. RMI の命名

6. クラス ファイルのプロバイダー (HTTP または FTP サーバー)

7. このリモート サービス クライアント プログラムを必要とするもの

3. RMI の目的は何ですか?

RMI の目的は、分散 Java アプリケーション間のリモート通信のためのサービスを提供し、分散サービスを提供することです。

現(xiàn)在、主要なアプリケーションは Spring、EJB などのさまざまな J2EE プロジェクト フレームワークにカプセル化されています (Spring と EJB は両方とも RMI テクノロジをカプセル化します)

Spring で RMI を?qū)g裝します:

① サーバー側(cè)でサービス インターフェイスを定義し、これらのインターフェイスを?qū)g裝するための特定のクラスを定義します;

② サーバー側(cè)で org.springframework.remoting.rmi.RmiServiceExporter クラスを使用してサービスを登録します;

③クライアントは org.springframework.remoting.rmi.RmiProxyFactoryBean を使用してリモートサービスのプロキシ機(jī)能を?qū)g裝します。

④クライアント上でサーバーと同じサービスインターフェースにアクセスするクラスを定義します

4 、RMI の制限は何ですか???????????????????????????????????????????????????????????????????????????????????????JRMP は Java リモート オブジェクト用に特別に開(kāi)発されたプロトコルです。JRMP は Java オブジェクト用に特別に開(kāi)発されたため、RMI は非 Java 言語(yǔ)で開(kāi)発されたアプリケーション システムを十分にサポートしていません。

Java 以外の言語(yǔ)で書かれたオブジェクトとは通信できません (つまり、クライアントとサーバーの両方が Java プログラムであるコードによるリモート呼び出しのみがサポートされます)。

5. RMI を使用する場(chǎng)合の制限は何ですか?

クライアントとサーバーの両方が Java で書かれているため、プラットフォームの互換性の唯一の要件は、両方の者が次のことを行うことです。バージョン互換性のある Java 仮想マシン上で実行します。

6. リモート メソッドへの RMI 呼び出しのパラメータと戻り値

リモート オブジェクトのメソッドを呼び出すとき、クライアントは元の型のデータをパラメータとして使用できるだけではありませんさらに、戻り値に対応するオブジェクトをパラメータとして渡すこともでき、プリミティブ型またはオブジェクトを返すことができ、これらはすべて Java のオブジェクト シリアル化 (シリアル化) テクノロジによって実裝されます。 (言い換えると、パラメータまたは戻り値がオブジェクトの場(chǎng)合、Serializable インターフェイスを?qū)g裝する必要があります)

7. RMI アプリケーションの基本モデル

Java RMI の詳細(xì)な図解説明 (例付き)8. RMI アーキテクチャ

スタブ/フレームワーク (スタブ/スケルトン) 層: クライアント側(cè)のスタブとサーバー側(cè)のフレームワーク;Java RMI の詳細(xì)な図解説明 (例付き)

リモート參照層: リモート參照動(dòng)作の処理

トランスポート層: 接続の確立と管理、およびリモート オブジェクトの追跡

9. RMI クラスとインターフェイス (完了するために必要なクラス)単純な RMI)。

Java RMI の詳細(xì)な図解説明 (例付き)

#(1) リモート インターフェース: メソッドを定義しないタグ付きインターフェースです。

パブリック インターフェース リモート{}

In RMI では、リモート インターフェイスは、リモート Java 仮想マシンから呼び出すことができるメソッドのセットを宣言します。リモート インターフェイスは次の要件を満たします:

1. リモート インターフェイスは、Java.rmi.Remote インターフェイスを直接または間接的に拡張する必要があり、クライアントとリモート インターフェイスが同じにない限り、パブリックとして宣言する必要があります。 package

2. リモート インターフェイスでメソッドを宣言する場(chǎng)合、アプリケーションに関連するメソッドをスローするだけでなく、RemoteException (またはそのスーパークラス、IOExcepion または Exception) 例外

も含める必要があります。 3. リモートメソッド宣言では、パラメータまたは戻り値として宣言されるリモートオブジェクトは、インタフェースの実裝クラスとしてではなく、リモートインタフェースとして宣言する必要があります。

(2) RemoteObject 抽象クラスは、Remote インターフェイスと Serializable インターフェイスを?qū)g裝しており、そのサブクラスは RMI サーバー機(jī)能を提供します。

(3) LocateRegistry Final() クラスは、特定のホストのブート リモート オブジェクト登録サーバー プログラムへの參照を取得する (つまり、スタブを作成する) か、リモート オブジェクト登録サービスを作成するために使用されます。特定のポートで通話を受信できるプログラム。

サーバー側(cè): リモート オブジェクト サービスを他のクライアントに提供する

SomeService servcie=……;//遠(yuǎn)程對(duì)象服務(wù)

1. レジストリ registry=LocateRegisty.getRegistry(); //レジストリはインターフェイスであり、リモートを継承し、このメソッドはローカルを返します。デフォルトのレジストリ ポート 1099 上のリモート オブジェクト レジストリへのホストの參照。

2. getRegistry(int port) は、指定されたポート上のリモート オブジェクト レジストリへのローカル ホストの參照を返します;

3. getRegistry(String host) は、デフォルトの指定されたホストを返しますレジストリ ポート 1099 リモート オブジェクト レジストリへの參照;

4.getRegistry(String host, int port) は、指定されたホストおよびポート

5.レジストリ上のリモート オブジェクト レジストリへの參照を返します。 bind(“Iserve”,service);//bind(String name,Remote obj) リモート參照をこのレジストリで指定された名前にバインドします。 name: リモート參照に関連する名前 obj: リモート オブジェクト (通常はスタブ) への參照

6, unbind (文字列名) は、レジストリ內(nèi)の指定された名前のバインドを削除します。

7. Rebind (String name, Remote obj) を再バインドします。名前がすでに存在するが、リモートが異なる場(chǎng)合は、それを置き換えます。リモートが同じ場(chǎng)合は、既存のバインドを破棄します。

8. lookup(String name) レジストリ內(nèi)の指定された名前にバインドされたリモート參照を返します。Remote

9 を返します。String[] list() このレジストリ內(nèi)にバインドされた名前の配列を返します。この配列には、このメソッドが呼び出されたときにバインドされたこのレジストリ內(nèi)の名前のスナップショットが含まれます。

クライアント側(cè): 対応するサービスリクエストをサーバーに提供します。

レジストリ registry=LocateRegisty.getRegistry();

SomeService servcie=(SomeService)registry.lookup(「私はサービスします」);
Servcie.requestService();

#(4) ネーミングクラスはレジストリクラスと同様です。

クライアント:

Naming.lookup(String url)
url 格式如下"rmi://localhost/"+遠(yuǎn)程對(duì)象引用

サーバー:

Registry registry=LocateRegistry.createRegistry(int port);
Naming.rebind(“service”,service);

(5) RMISecurityManager クラス

RMI リファレンス プログラムでは、セキュリティ マネージャーが設(shè)定されていない場(chǎng)合、スタブとクラスはローカル クラスパスからのみロードできるため、リモート メソッド呼び出しによってダウンロードされたコードによってアプリケーションが侵害されることはありません。

リモート ホストからコードをダウンロードする前に、次のコードを?qū)g行して RMISecurityManager をインストールする必要があります。 :

System.setSecurityManager(new RMISecurityManager());

10. デモ開(kāi)発

デモを作成するために、次のことに分かれます。 2 つの部分、1 つの部分はサーバー側(cè)コードの一部であり、クライアント側(cè)コードです。クライアント側(cè)コードは主にサーバー側(cè)コードを使用するためのものです。もちろん、このコードは問(wèn)題を説明するためだけに非常に単純ですが、実際の使用はさらに複雑になります。

(1) 目的

リモート側(cè)のコードを含むサーバー側(cè)の Java プロジェクトを構(gòu)築し、インターフェイスを定義し、インターフェイスの実裝を定義して、クライアント側(cè)の Java プロジェクトを作成します。エンドサービスの RMI メソッドを介してリモート側(cè)を使用します。

(2) コード構(gòu)造

Java RMI の詳細(xì)な図解説明 (例付き)#(3) リモートサービスコード

1. リモートサービスインターフェース定義

最初のステップは、サービス インターフェイスの Java コードを作成してコンパイルすることです。このインターフェイスは、リモート サービスを提供するすべての機(jī)能を定義します。ソース プログラムは次のとおりです:

UserManagerInterface.java

package cn.com.tt.rmiserver.stub;

import java.rmi.Remote;
import java.rmi.RemoteException;

import cn.com.tt.rmiserver.bean.Account;

public interface UserManagerInterface extends Remote{
    public String getUserName() throws RemoteException;
    public Account getAdminAccount() throws RemoteException;
}

インターフェイスは Remote クラスを継承する必要があり、定義された各メソッドは RemoteException をスローする必要があります例外オブジェクト。

2. インターフェイスの具體的な実裝

2 番目のステップは、上記のインターフェイスを?qū)g裝することです:

UserManagerImp.java

package cn.com.tt.rmiserver;

import java.rmi.RemoteException;

import cn.com.tt.rmiserver.stub.UserManagerInterface;
import cn.com.tt.rmiserver.bean.Account;

public class UserManagerImp implements UserManagerInterface {
    public UserManagerImp() throws RemoteException {

    }
    private static final long serialVersionUID = -3111492742628447261L;

    public String getUserName() throws RemoteException{
        return "TT";
    }
    public Account getAdminAccount() throws RemoteException{
        Account account=new Account();
        account.setUsername("TT");
        account.setPassword("123456");
        return account;
    }
}

3. Bean を定義します。 、Serializable シリアル化インターフェイスを?qū)g裝します。つまり、クライアントとサーバー間で送信できるシリアル化可能なオブジェクトです。

Account.java

package cn.com.tt.rmiserver.bean;

import java.io.Serializable;

public class Account implements Serializable,Cloneable{
    private static final long serialVersionUID = -1858518369668584532L;
    private String username;
    private String password;
    
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
}

4. サーバー側(cè)でメイン プログラム エントリを定義します。

Entry.java

package cn.com.tt.rmiserver.entry;

import java.rmi.AlreadyBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;

import cn.com.tt.rmiserver.UserManagerImp;
import cn.com.tt.rmiserver.stub.UserManagerInterface;

public class Entry {
    public static void main(String []args) throws AlreadyBoundException, RemoteException{
        UserManagerImp userManager=new UserManagerImp();
        UserManagerInterface userManagerI=(UserManagerInterface)UnicastRemoteObject.exportObject(userManager,0);
        // Bind the remote object's stub in the registry
        Registry registry = LocateRegistry.createRegistry(2002);
       
        registry.rebind("userManager", userManagerI);
        System.out.println("server is ready");
        }
}

(4) クライアント側(cè)のコード

1、把Server端的Account類和接口UserManagerInterface 導(dǎo)出Export成jar包,命名為:RmiServerInterface.jar。導(dǎo)入到client中。

2、項(xiàng)目——右鍵——Export——java——jar file——next——選擇Account類和接口UserManagerInterface——命名為:RmiServerInterface.jar如下圖:

Java RMI の詳細(xì)な図解説明 (例付き)

3. 新建一個(gè)java Project,導(dǎo)入jar包,編寫客戶端代碼。

4. 代碼

ClientEntry.java

package weiblog.rmi;

import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

import cn.com.tt.rmiserver.stub.UserManagerInterface;

public class ClientEntry {
    
    public static void main(String []args){
        
        try {
            Registry registry = LocateRegistry.getRegistry("localhost",2004);
            UserManagerInterface userManager = (UserManagerInterface)registry.lookup("userManager");
            System.out.println("用戶名是"+userManager.getAdminAccount().getUsername()
                    +"密碼"+userManager.getAdminAccount().getPassword());
        } catch (RemoteException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NotBoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
    }

}

5. 先運(yùn)行服務(wù)器端代碼, 然后運(yùn)行客戶端代碼,就會(huì)顯示運(yùn)行結(jié)果,客戶端可以運(yùn)行多次,每次都可以取得服務(wù)器端的對(duì)象。如果要再次運(yùn)行客戶端代碼就需要更改端口號(hào),如果不更改就會(huì)顯示端口號(hào)被占用。

更多java知識(shí)請(qǐng)關(guān)注java基礎(chǔ)教程欄目。

以上がJava RMI の詳細(xì)な図解説明 (例付き)の詳細(xì)內(nèi)容です。詳細(xì)については、PHP 中國(guó)語(yǔ) Web サイトの他の関連記事を參照してください。

このウェブサイトの聲明
この記事の內(nèi)容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰屬します。このサイトは、それに相當(dāng)する法的責(zé)任を負(fù)いません。盜作または侵害の疑いのあるコンテンツを見(jiàn)つけた場(chǎng)合は、admin@php.cn までご連絡(luò)ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脫衣畫像を無(wú)料で

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード寫真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

寫真から衣服を削除するオンライン AI ツール。

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無(wú)料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡(jiǎn)単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無(wú)料のコードエディター

SublimeText3 中國(guó)語(yǔ)版

SublimeText3 中國(guó)語(yǔ)版

中國(guó)語(yǔ)版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強(qiáng)力な PHP 統(tǒng)合開(kāi)発環(huán)境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開(kāi)発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

JDBCを使用してJavaのトランザクションを処理する方法は? JDBCを使用してJavaのトランザクションを処理する方法は? Aug 02, 2025 pm 12:29 PM

JDBCトランザクションを正しく処理するには、最初に自動(dòng)コミットモードをオフにし、次に複數(shù)の操作を?qū)g行し、結(jié)果に応じて最終的にコミットまたはロールバックする必要があります。 1。CONN.SETAUTOCOMMIT(FALSE)を呼び出して、トランザクションを開(kāi)始します。 2。挿入や更新など、複數(shù)のSQL操作を?qū)g行します。 3。すべての操作が成功した場(chǎng)合はconn.commit()を呼び出し、データの一貫性を確保するために例外が発生した場(chǎng)合はconn.rollback()を呼び出します。同時(shí)に、リソースを使用してリソースを管理し、例外を適切に処理し、接続を密接に接続するために、接続の漏れを避けるために使用する必要があります。さらに、接続プールを使用してセーブポイントを設(shè)定して部分的なロールバックを達(dá)成し、パフォーマンスを改善するためにトランザクションを可能な限り短く保つことをお?jiǎng)幛幛筏蓼埂?/p>

Javaでカレンダーを操作する方法は? Javaでカレンダーを操作する方法は? Aug 02, 2025 am 02:38 AM

Java.Timeパッケージのクラスを使用して、古い日付とカレンダーのクラスを置き換えます。 2。LocalDate、LocalDateTime、LocalTimeを通じて現(xiàn)在の日付と時(shí)刻を取得します。 3。of()メソッドを使用して特定の日付と時(shí)刻を作成します。 4.プラス/マイナスメソッドを使用して、時(shí)間を不正に増加させて短縮します。 5. ZonedDateTimeとZoneIDを使用して、タイムゾーンを処理します。 6。DateTimeFormatterを介したフォーマットおよび解析の文字列。 7.インスタントを使用して、必要に応じて古い日付型と互換性があります?,F(xiàn)代のJavaでの日付処理は、java.timeapiを使用することを優(yōu)先する必要があります。

Javaフレームワークの比較:Spring Boot vs Quarkus vs Micronaut Javaフレームワークの比較:Spring Boot vs Quarkus vs Micronaut Aug 04, 2025 pm 12:48 PM

Pre-formanceTartuptimeMemoryusage、quarkusandmicronautleadduetocopile-timeprocessingingandgraalvsupport、withquarkusoftentylightbetterine serverlessシナリオ。

ネットワークポートとファイアウォールの理解 ネットワークポートとファイアウォールの理解 Aug 01, 2025 am 06:40 AM

ネットワークポートアンドファイアワルクトグテルトエナブルコマニケーションwhiledensuringsecurity.1.networksarevirtualendpointsnumbered0–655 35、withwell-knownportslike80(http)、443(https)、22(ssh)、および25(smtp)識(shí)別pecificservices.2.portsoperateovertcp(信頼できる、c

Garbage CollectionはJavaでどのように機(jī)能しますか? Garbage CollectionはJavaでどのように機(jī)能しますか? Aug 02, 2025 pm 01:55 PM

JavaのGarbage Collection(GC)は、メモリを自動(dòng)的に管理するメカニズムであり、到達(dá)不可能なオブジェクトを取り戻すことでメモリ漏れのリスクを軽減します。 1.GCルートオブジェクトからのオブジェクトのアクセシビリティ(スタック変數(shù)、アクティブスレッド、靜的フィールドなど)、および到達(dá)不可能なオブジェクトはゴミとしてマークされています。 2。マーククリアリングアルゴリズムに基づいて、すべての到達(dá)可能なオブジェクトをマークし、マークのないオブジェクトをクリアします。 3.世代の収集戦略を採(cǎi)用する:新世代(Eden、S0、S1)は頻繁にMinorGCを?qū)g行します。高齢者のパフォーマンスは少なくなりますが、MajorGCを?qū)g行するのに時(shí)間がかかります。 Metaspaceはクラスメタデータを保存します。 4。JVMはさまざまなGCデバイスを提供します。SerialGCは小さなアプリケーションに適しています。 ParallelGCはスループットを改善します。 CMSが減少します

ユーザーデータにHTML「入力」タイプを使用します ユーザーデータにHTML「入力」タイプを使用します Aug 03, 2025 am 11:07 AM

適切なHTMLinputタイプを選択すると、データの精度を向上させ、ユーザーエクスペリエンスを向上させ、使いやすさを向上させることができます。 1.テキスト、電子メール、電話、番號(hào)、日付など、データ型に従って対応する入力タイプを選択します。 2。HTML5を使用して、より直感的な相互作用方法を提供できるU(xiǎn)RL、色、範(fàn)囲、検索などの新しいタイプを追加します。 3.プレースホルダーと必要な屬性を使用して、フォームフィリングの効率と精度を改善しますが、プレースホルダーがラベルを置き換えることはできないことに注意してください。

Javaビルドツールの比較:Maven vs. Gradle Javaビルドツールの比較:Maven vs. Gradle Aug 03, 2025 pm 01:36 PM

gradleisthebetterchoiceformostnewprojectoitssuperorfficability、performance、andmoderntoolingsupport.1.gradle’sgroovy/kotlindslismoreconciseandexpressiveethanmaven’sverboseml.2.gradleorformsmavenbenbumebutedwitedwitedwitedspedexは

説明された延期聲明の例で進(jìn)みます 説明された延期聲明の例で進(jìn)みます Aug 02, 2025 am 06:26 AM

Deferは、クリーニングリソースなど、関數(shù)が戻る前に指定された操作を?qū)g行するために使用されます。パラメーターは、延期時(shí)にすぐに評(píng)価され、関數(shù)は最後のファーストアウト(LIFO)の順に実行されます。 1.複數(shù)の債務(wù)は、宣言の逆の順序で実行されます。 2.ファイルの閉鎖などの安全なクリーニングに一般的に使用されます。 3。指定された返品値を変更できます。 4.回復(fù)に適したパニックが発生した場(chǎng)合でも実行されます。 5。リソースの漏れを防ぐために、ループで延期の亂用を避けます。正しい使用により、コードのセキュリティと読みやすさが向上します。

See all articles