gpt4 book ai didi

java - 在 Java 中,不可序列化的套接字是否必须阻止使用客户端-服务器观察者模式?

转载 作者:行者123 更新时间:2023-11-30 07:26:24 25 4
gpt4 key购买 nike

在我的 Java Sockets 程序中,我实现了客户端-服务器观察者模式。也就是说,服务器主题将其服务器事件发布给订阅服务器的客户端观察者。这就是理论。

实际上,我无法通过套接字发送客户端观察者来订阅服务器。出现的错误是:“java.io.NotSerializableException:java.net.Socket。”我认为这意味着 Java 提示客户端观察器包含一个套接字,众所周知,它不是可序列化的。

但是,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
}

最佳答案

您有几种方法可以解决此问题:

  1. 将您的套接字标记为 transient

    transient 套接字connectingSocket = null;

  2. 而不是实现 Serializable实现 Externalizable然后在您实现的读写对象中忽略 Socket。

除此之外,您还应该阅读

关于 transient :

  1. Post on SO

关于外部化:

  1. Javabeat

关于java - 在 Java 中,不可序列化的套接字是否必须阻止使用客户端-服务器观察者模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10364150/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com