2012-01-17 2 views
1

解決に大きな問題があり、解決方法がわかりません。オブジェクトを呼び出すスレッドサーバーでは、ObjectOutputStreamを使用した後にメソッドwait()を呼び出し、オブジェクトをサーバーに接続されているクライアントスレッドに送信します。オブジェクトが他の側に到着すると、私はオブジェクトを呼び出します。方法はnotify()ですが、オブジェクトは自分の待機状態から復帰しません。これは、送信されたオブジェクトが同じではないために発生します。この大きな問題をどうやって解決できますか?サーバのwait()で送信されたクライアントのスレッドに通知します。

答えて

3

クライアントとサーバーが2つの異なるマシン/ JVMにあるかどうかにかかわらず、シリアル化後に取得するオブジェクトは、元のオブジェクトとは異なります。 あるオブジェクトで "wait()"を呼び出すと、スレッドはSAMEオブジェクトのnotify()を呼び出すまでブロックします。 ここでは2つの異なるオブジェクトがあるため、待機通知メカニズムは機能しません。 ネットワーク通信を使用してサーバーに確認応答を送信する必要があります(ソケットがある可能性があります)。

+0

あなたはネットワーク通信を使用してサーバーに何らかの確認を送信する必要があります。 – Mazzy

3

私が正しく理解していれば、サーバー上のオブジェクトをシリアル化してクライアントに送信し、クライアント上でnotify()を呼び出し、そのサーバーに影響することを期待しています。これは、異なるコンピュータ上、または少なくとも異なるJVM上にあるため動作しません。サーバーにメッセージを送り返す唯一の方法は、ソケットを通して行うことです。

+0

Zahniser私は、クライアントとソケットを作成するのと同じJVMでこのアプリケーションをテストしていますsocketClient = new Socket( "localhost"、port_number)、ServerSocket serverSocket =新しいServerSocket(port_number)、そして2つの異なるマシンではありません – Mazzy

+0

If "server"と "client"のスレッドは同じJVM上にあるので、ソケットを使わずに直接オブジェクトを渡すことができます(クライアントスレッドによってポーリングされたキューにオブジェクトを追加するなど)。オブジェクトがソケットを通過する必要がある場合は、コピーが相手側で作成され、通知を返す唯一の方法はソケットを経由する方法です。 –

+0

JVM *がある場合は@Mazzy *それらは同じではありません。 'notify'を期待通りに動作させるためには、両方のオブジェクトが1つのJVMに存在する必要があります。 –

1

synchronizationに関するドキュメントを読むことをお勧めします。

関連する問題