2016-08-06 16 views
1

だ呼び出すと、サーバが「実行」含むJavaオブジェクトを送り返すことにより、特定のHTTP *要求に応答するように、私はそれを作りました方法。インターネットを介してオブジェクトを送信し、それは私がJavaのWebサーバーを持っている方法

リモートオブジェクトのメソッドを実行したいと考えています。

  • 私はので、私はobject.getClass()しようとすることができるのと同じ方法+パッケージ名を持つローカルクラスを作ることを考え、クラスを送信しないので、私はリフレクションを使用することはできません

  • 私は送信するオブジェクトからtoString()にコードブロック全体を置くのは嫌いです。 (オーバーライド)

  • 私はインターフェイスにキャストすることはできません。

私はまた、どのようにこの作業することができ、サーバ上に作成し、クライアントにアクセスされるクラスファイルの定義を持っているの.jarライブラリを作ることを考えていますか?

私はこれについて別の質問を見つけることができなかったので、私はここにこれを残します。

EDIT:

  • 私は、サーブレットは、サーバー上のオブジェクトのインスタンスを作る、それがにObjectOutputStreamを使用してクライアントに送信します、サーブレットと通信するのURLConnectionを使用して、同様のObjectInputStreamよそれを得るためにクライアント上で。

  • なしならば、私はいくつかのRMIのチュートリアルを検索し、RMIにはいくつかの選択肢を探しています。

  • 最初はRMIを使用しないことについて:多分私はクライアント - サーバ間の接続を望んでいないかもしれません。おそらくオブジェクトを逆シリアル化してメソッドをチェック/呼び出したいと思うかもしれません。

+0

downvotedを取得した理由がわかりません。おそらくあなたが探しているのは、https://docs.oracle.com/javase/tutorial/rmi/または他のRMIです。他に誰もしなければ時間があるときには、私はプロッパの答えを書いていくつもりです。 – Caelum

+0

"サーバーはHTMLリクエストに応答します"というのはブラウザのクライアントですか?その場合、ブラウザはJavaのシリアル化されたオブジェクトバイトを認識できません。あなたの要件は何ですか? Java RMIは、2つのJavaアプリケーションの間で必要なものをサポートしますが、ブラウザとWebサーバーの間には必要ありません。 –

+0

追加情報! –

答えて

2

1つのJava仮想マシン(Javaプロセス)から別のJava仮想マシンにシリアル化オブジェクトを「送信」する場合は、.classファイルがすでに両端に存在する必要があります。

  • あなたのクライアントは、Javaでなければならない、またはJavaを実行することができ、そしてそれはオブジェクトに対応する.classファイルを持っている:あなたはあなたの現在のアプローチを継続することを決定した場合は、以下が必要になりますローカルで使用可能になっているか、サーバーにアクセスする前にサーバーからダウンロードする必要があります。

  • あなたは何とかHTTP以内にシリアライズされたオブジェクトストリームをラップする必要があります。 HTTPは、Webページを要求および送信するためのプロトコルです。 Javaのシリアライゼーションプロトコル(たとえば余分なヘッダーが含まれています)と互換性がなく、期待通りに動作するためには、HTTPペイロード内にJavaシリアル化をラップする必要があります。

  • あなたがシリアライズされたオブジェクトを送信すると、あなたが実際に(そのフィールドを移動してオブジェクトとすべてのオブジェクトがアクセス可能)、「オブジェクトグラフ」を送っています。これは効率が悪くなる可能性があります。この理由からシリアライゼーションがあなたにとって最良の答えとは限りません。

他のメカニズムを使用するのがはるかに簡単です:

  • あなたはHTTPを避ける場合は、あなたが余分なラッパーの必要性を回避。シリアライズされたオブジェクトを接続、受信、および送信するシンプルなサーバーを作成することは、従来のJava Webアプリケーション内でHTTPのラッパーを作成するよりはるかに簡単で効率的です(Javaアプリケーションサーバーはリソースを必要とします)。

  • KryoなどのJavaシリアル化/ネットワーキングライブラリを使用することを検討してください。これらのライブラリには、組み込みのサーバが付属しており、送信される内容をきめ細かく制御できます。

  • JavaにはRMI( "Remote Method Invocation")のサポートが組み込まれています。これはあなたが実際に達成しようとしているようです。オブジェクトがローカルまたはリモートであることを意識する必要はなくなりました。同じように動作するように見え、必要なすべてのネットワークとシリアル化はバックグラウンドで行われます。 all about itを読んでください。

+0

私は両方のクラスで同じクラスを持つことによって動作させ、クライアントはそれらをダウンロードします。 –

関連する問題