Я занимаюсь распределенными системами.Я запускаю 4 процесса, соединенных друг с другом через сокеты, у каждого из них есть серверный поток для получения данных и список соединений, в которые я могу отправлять данные в любое время.Они впервые обмениваются сообщениями, но когда узел № 3 получает второе сообщение, я получаю следующую ошибку:
Exception in thread "Thread-3" java.lang.InternalError: Unexpected call when not initialized
at java.base/java.io.ObjectStreamClass.requireInitialized(ObjectStreamClass.java:853)
at java.base/java.io.ObjectStreamClass.checkDeserialize(ObjectStreamClass.java:862)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2061)
at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1594)
at java.base/java.io.ObjectInputStream.skipCustomData(ObjectInputStream.java:2310)
at java.base/java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1898)
at java.base/java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1772)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2060)
at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1594)
at java.base/java.io.ObjectInputStream.skipCustomData(ObjectInputStream.java:2310)
at java.base/java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1898)
at java.base/java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1772)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2060)
at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1594)
at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:430)
at com.election.Channel.extractMessage(Canal.java:27)
at com.election.Channel.run(Canal.java:38)
Ранее я получал еще одну ошибку, StreamCorruptedException: недопустимый код типа: AC но мне удалось это исправить, сохранив список ObjectOutputStreams вместо того, чтобы постоянно создавать новые из списка сокетов, который у меня был ранее.
Мой код:
У меня есть поток сервера, который выполняет это:
public void listen() {
Socket socketClient;
Channel channel;
while (true){
try {
socketClient = socketServer.accept();
channel = new Channel(socketClient, this.process);
channel.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Поток канала имеет конструктор и запускает это при запуске:
public void extractMessage(){
ObjectInputStream in = null;
try {
in = new ObjectInputStream(socket.getInputStream());
} catch (IOException e) {
e.printStackTrace();
}
try {
while (true) {
// Message is an object with some basic data
Message message = (Message)in.readObject();
// process is another object running in another thread
process.handleMessage(mensage);
}
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
Я отправляю данные, подобные этому
private void sendMessage(Node node, Mensagem m){
try {
// Node is an object that contains an ObjectOutputStream
node.getOos().writeObject(m);
} catch (IOException e) {
e.printStackTrace();
}
}
РЕДАКТИРОВАТЬ: Запустите его снова и ...
java.io.StreamCorruptedException: invalid type code: 00
at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1622)
at java.base/java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2355)
at java.base/java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2249)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2087)
at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1594)
at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:430)
at com.election.Channel.extractMessage(Canal.java:27)
at com.election.Channel.run(Canal.java:38)