Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> java.io.StreamCorruptedException: invalid type code: AC  
V
    Опции темы
Fieral
Дата 3.2.2009, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 250
Регистрация: 10.12.2007

Репутация: нет
Всего: 1



проблема такая: 
написал сервер и клиент

сервер открывает порт и ждет клиента, когда же клиент подключантся:

1)сервер "подхватывает" сокет клиента, берёт у сокета инпут и аутпут стримы,
вешает на них новые обжект_инпут и обжект_аутпут стримы 

2) запускает 2 зацикленных треда:
 первый тред проверяет некоторый Vector<Message> Out и если находит там сообщения для отправки то записывает их в обжект_аутпут_стрим
 второй наоборот - пытaется прочитать объект Message из стрима и кладёт прочитанное в Vector<Message> In

В эклипсе всё нормально работает, а нетбинс стал выбрасывать java.io.StreamCorruptedException: invalid type code: AC

вроде нашел тему: http://forum.vingrad.ru/topic-203163.html
но так ничего и не понял

в чём проблема и как её починить?


Это сообщение отредактировал(а) Fieral - 3.2.2009, 16:17
--------------------
Если собака свернулась калачиком, значит будет дождь, а если сидит выпучив глаза, значит у неё запор.
PM MAIL   Вверх
Fieral
Дата 3.2.2009, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 250
Регистрация: 10.12.2007

Репутация: нет
Всего: 1




это ресивер
Код
try {
            
           **** this.mIn = new ObjectInputStream(ii);
            message = (Message) mIn.readObject();;
            if (message == null) {
                throw new HollyShitException("Message = null!");
            }
            this.OUT.putMail(this.message);
            //this.mIn.close();
            
            
        } catch (Exception e) {
            e.printStackTrace();
            Message M = new Message("inform");
            M.addLine("who", "NetReceiver");
            M.addLine("info", "Stoped");
            this.Boss.Speak(M);
            this.Stop();
        }


это сендер
Код
Message M = this.IN.getMail();

        try {
            //
                        ****this.mIn = new ObjectOutputStream(oo);
            this.mIn.writeObject(M);
            this.mIn.flush();
            //this.mIn.close();
            
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            Message S = new Message("inform");
            M.addLine("who", "NetReceiver");
            M.addLine("info", "Stoped");
            this.Boss.Speak(S);
            this.Stop();

        }


отсутствие строк помеченых звёдочкой выбрасывает:

Код
java.io.StreamCorruptedException: invalid type code: AC
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1356)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
    at rebecca.e.net.NetReceiver.Execute(NetReceiver.java:20)
    at rebecca.e.core.LinearProcess.run(LinearProcess.java:65)
    at java.lang.Thread.run(Thread.java:619)


если же закрывать ObjectOutputStream то это влечёт закрытие Socket
Код

java.net.SocketException: socket closed
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:129)
at java.io.ObjectInputStream$PeekInputStream.read(ObjectInputStream.java:2264)
at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2277)
at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2748)
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:780)
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:280)
at rebecca.e.net.NetReceiver.Execute(NetReceiver.java:18)
at rebecca.e.core.LinearProcess.run(LinearProcess.java:65)
at java.lang.Thread.run(Thread.java:619)


а если оставить то получается что для каждого сообщения будет создаваться новый ObjectOutputStream  и они будут накапливаться в памяти пока жава не вывалит "переполнение кучи"
--------------------
Если собака свернулась калачиком, значит будет дождь, а если сидит выпучив глаза, значит у неё запор.
PM MAIL   Вверх
ivg
Дата 3.2.2009, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


Профиль
Группа: Участник
Сообщений: 686
Регистрация: 8.2.2006
Где: Екатеринбург

Репутация: 33
Всего: 81



Создавайте объекты ObjectInputStream и ObjectOutputStream единожды при получении соответствующих Stream'ов из сокета, как на сервере так и на клиенте.
PM MAIL   Вверх
COVD
Дата 3.2.2009, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 17
Всего: 43



В большинстве учебниках как правило приводится пример когда создается соединение, создаются стримы и демонстрируется однократная пересылка обьекта. Все замечательно. Учебные примеры очевидно предполагают для каждого нового обьекта создавать новое соединение и новый стрим. Но, как правильно выше отметил ivq, все же хотелось бы использовать одно соединение и одну пару стримов. И тогда, после успешной пересылки первого обьекта , при попытке переслать второй обьект через то же соединение пользователь обнаруживает упомянутые выше гадости. А все потому , что в замечательных примерах не сказано, что надо использовать метод  reset() всякий раз после записи обьекта : 

 
Код

 private ObjectOutputStream oos;

  public void write(Object obj) throws Exception{
    oos.writeObject(obj);
    oos.reset();
  }//write


А не пишут про это авторы учебников исключительно для того, чтобы побудить программистов использовать RMI.   smile  
PM MAIL   Вверх
Fieral
Дата 3.2.2009, 19:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 250
Регистрация: 10.12.2007

Репутация: нет
Всего: 1



COVD - не помогло.

ivg - собсно тема какраз о том что это не работает, будте внимательны.
--------------------
Если собака свернулась калачиком, значит будет дождь, а если сидит выпучив глаза, значит у неё запор.
PM MAIL   Вверх
ivg
Дата 3.2.2009, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


Профиль
Группа: Участник
Сообщений: 686
Регистрация: 8.2.2006
Где: Екатеринбург

Репутация: 33
Всего: 81



Цитата(Fieral @  3.2.2009,  21:53 Найти цитируемый пост)
собсно тема какраз о том что это не работает, будте внимательны.

Код клиента покажите от момента создания сокета до момента создания ObjectOutputStream.
PM MAIL   Вверх
Fieral
Дата 3.2.2009, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 250
Регистрация: 10.12.2007

Репутация: нет
Всего: 1




это ресивер,
сендер аналогичен, но
если нужно - выложу остальной код завтра (как до работы дойду)
код:
Код

package rebecca.e.net;

import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;

import rebecca.e.core.Boss;
import rebecca.e.core.LinearProcess;
import rebecca.e.mail.MailBox;
import rebecca.e.mail.Message;
import rebecca.e.util.HollyShitException;

public class NetReceiver extends LinearProcess {

    public void Execute() {

        try {
            
            message = (Message) mIn.readObject();;
            if (message == null) {
                throw new HollyShitException("Message = null!");
            }
            this.OUT.putMail(this.message);
        } catch (Exception e) {
            e.printStackTrace();
            Message M = new Message("inform");
            M.addLine("who", "NetReceiver");
            M.addLine("info", "Stoped");
            this.Boss.Speak(M);
            this.Stop();
        }

    }

    public boolean ExecuteCondition() {
        return true;
    }

    Boss Boss = null;

    public void Install(Boss B) {
        this.Boss = B;

    }

    @Override
    public void DeInstall() {
        try {
            this.mIn.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    MailBox OUT = null;
    private ObjectInputStream mIn = null;
    Message message = null;

    public NetReceiver(InputStream i, MailBox MAIL) throws IOException {
        this.OUT = MAIL;
        this.mIn = new ObjectInputStream(i);

        // this.setDaemon(true);
    }

}

--------------------
Если собака свернулась калачиком, значит будет дождь, а если сидит выпучив глаза, значит у неё запор.
PM MAIL   Вверх
ivg
Дата 4.2.2009, 01:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


Профиль
Группа: Участник
Сообщений: 686
Регистрация: 8.2.2006
Где: Екатеринбург

Репутация: 33
Всего: 81



вот такой код: new ObjectOutputStream(OutputStream oStream); - выводит в oStream последовательность байт (hex): AC,ED,00,05. Это так называемый StreamHeader. Аналогично new ObjectInputStream(InputStream iStream); читает его из iStream. Обратив внимание на исключение: java.io.StreamCorruptedException: invalid type code: AC, можно предположить, что при отсылке очередного сообщения, каждый раз создаётся новый ObjectOutputStream. Код сендера вы так и не показали. Если предположить, что он аналогичен ресиверу, т. е. new ObjectOutputStream() вызывается только в конструкторе, то проверьте тот вариант, что у вас нигде в коде не создаётся новый дополнительный объект сендера для старого сокета(т. е. для сокета/его OutputStream'а, для которого сендер уже был создан).
PM MAIL   Вверх
Fieral
Дата 4.2.2009, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 250
Регистрация: 10.12.2007

Репутация: нет
Всего: 1



Спасибо ivg!  smile 
Я был уверен на 99.9%, что не создаётся лишний  сендер, но совесть сказала что 99.9% - мало, поэтому я ещё раз скурпулёзно прочесал весь проект и, таки, нашел засранца. 

--------------------
Если собака свернулась калачиком, значит будет дождь, а если сидит выпучив глаза, значит у неё запор.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0488 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.