【发布时间】:2012-04-28 13:54:09
【问题描述】:
在我的 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
}
【问题讨论】:
-
这对我来说毫无意义。序列化套接字?
-
是的。令您惊讶的是,Observer 显然不是 Java 中套接字的好模式。很抱歉浪费了大家的时间。
-
不要误会我的意思,我不是客户端服务器方面的专家,所以不要把我的怀疑当作福音,但这看起来很奇怪。
-
有趣的问题和讨论,1+
-
为了使用
Sockets 实现这一点,您必须轮询套接字以接收观察者事件。这对我来说似乎是矛盾的:观察者模式的重点是避免轮询。
标签: java sockets serialization client-server