java.io.StreamCorruptedException: недопустимый код типа: AC При попытке связи через ObjectOuputStream

Я использую ClientHandler на стороне сервера для обработки связи и ServerConnection на стороне клиента для обработки связи там.

Вот ClientHandler (на стороне сервера)

public void run() {

    System.out.println("Running");
    try {
        input = new ObjectInputStream(socket.getInputStream());
    } catch (IOException e) {
        e.printStackTrace();
    }

    while (isListening) {

        try {



            String packetMessageJson = (String) input.readObject();
            Gson gson = new Gson();
            PacketMessage packetMessage = gson.fromJson(packetMessageJson, PacketMessage.class);

            Double auctionID = null;


            switch (packetMessage.getType()) {

Это использование работает нормально, пока я не сделаю это дважды. Со стороны клиента

ObjectOutputStream objectOutputStream = новый ObjectOutputStream (socket.getOutputStream()); objectOutputStream.writeObject(sampleObject)

Какие меры предосторожности должны быть?

Выскакивает ошибка AC При попытке связи. Я знаю, что это означает, что я дважды инициализирую ObjectOutputStream, но есть ли способ обойти это, чтобы я мог использовать контроллеры JavaFx для переключения между представлениями без двойной инициализации


person Memli Restelica    schedule 14.12.2020    source источник
comment
Это использование работает нормально, пока я не сделаю это дважды. - Ага. Смотрите первый дуплинк, почему. Есть ли способ обойти это? Есть хакерский способ (см. 2-й дубликат), но он имеет тонкие проблемы. В этом случае вам лучше использовать сквозной JSON (IMO).   -  person Stephen C    schedule 14.12.2020
comment
Предоставьте минимальный воспроизводимый пример.   -  person 0009laH    schedule 14.12.2020
comment
@StephenC Я использую сквозное преобразование Gson, так как это TCP, и мне нужно передавать пакеты.   -  person Memli Restelica    schedule 14.12.2020
comment
Эм... вы неправильно понимаете, что я говорю. Ваш код показывает, что вы используете ObjectStream для передачи строки, содержащей кодировку JSON, через поток сокета. ТОГДА вы используете GSON для анализа JSON и создания из него PacketMessage. Почему бы вам просто не передать String как текст поверх потока? Таким образом, вы можете пройти столько из них, сколько захотите. Если вы посмотрите на методы DataInputStream и DataOutputStream, а также на методы readUTF/writeUTF, вы увидите способ передачи строк как единиц.   -  person Stephen C    schedule 14.12.2020