在我的 Java Sockets 程序中,我实现了客户端-服务器观察者模式。也就是说,服务器主体将其服务器事件发布给已订阅服务器的客户端观察者。这就是理论。
实际上,我无法通过套接字发送客户端观察者来订阅服务器。出现的错误是:“java.io.NotSerializableException:java.net.Socket。” 我认为这意味着 Java 抱怨客户端观察者包含一个 Socket,众所周知,它不是可序列化的。
但是,Socket 是客户端和服务器之间的通信手段!
当客户端似乎包含不可序列化的路障时,如何实现客户端-服务器观察者模式?
这是一个代码概述,可让您了解正在发生的事情:
服务器
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
}