«java.lang.InternalError: неожиданный вызов, когда он не инициализирован» при использовании сокетов - PullRequest
0 голосов
/ 29 ноября 2018

Я занимаюсь распределенными системами.Я запускаю 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...