私のJavaSocketsプログラムでは、クライアントサーバーオブザーバーパターンを実装しました。つまり、サーバーサブジェクトは、サーバーにサブスクライブしているクライアントオブザーバーにサーバーイベントを公開します。それが理論です。
実際には、サーバーにサブスクライブするためにソケットを介してクライアントオブザーバーを送信することはできません。表示されるエラーは、「java.io.NotSerializableException:java.net.Socket」です。これは、Javaが、クライアントオブザーバーに、シリアル化できないソケットが含まれていると不平を言っていることを意味していると思います。
ただし、ソケットはクライアントとサーバー間の通信手段です。
クライアントにシリアル化できない障害物が含まれているように見える場合、クライアントサーバーオブザーバーパターンを実装するにはどうすればよいですか?
何が起こっているのかを理解するためのコードの概要は次のとおりです。
サーバ
public class Server implements ServerSocketPublisher {
// traditional Observer publisher methods implemented here, such as register,
// deregister, notifySubscribers
// ServerSocket implemented here. Waiting on accept()
}
クライアント
public class Client implements ClientSocketSubscriber, Serializable {
// traditional Observer subscriber methods implemented here, i.e. updateClient
Socket connectingSocket = null; //I SUSPECT THIS VARIABLE IS THE PROBLEM
try {
connectingSocket = new Socket();
// set SocketAddress and timeout
connectingSocket.connect(sockAddr, timeout)
if (connectingSocket.isConnected()) {
ObjectOutputStream oos = new ObjectOutputStream
(connectingSocket.getOutputStream());
oos.writeObject(this); // THIS LINE THROWS THE ERROR in STACKTRACES
oos.flush();
oos.close();
}
} catch (/*various exceptions*/) {
}
// close connectingSocket
}