![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| Fieral |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 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 --------------------
Если собака свернулась калачиком, значит будет дождь, а если сидит выпучив глаза, значит у неё запор. |
|||
|
||||
| Fieral |
|
||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 250 Регистрация: 10.12.2007 Репутация: нет Всего: 1 |
это ресивер
это сендер
отсутствие строк помеченых звёдочкой выбрасывает:
если же закрывать ObjectOutputStream то это влечёт закрытие Socket
а если оставить то получается что для каждого сообщения будет создаваться новый ObjectOutputStream и они будут накапливаться в памяти пока жава не вывалит "переполнение кучи" --------------------
Если собака свернулась калачиком, значит будет дождь, а если сидит выпучив глаза, значит у неё запор. |
||||||||
|
|||||||||
| ivg |
|
|||
![]() Autonomous R&D ![]() ![]() Профиль Группа: Участник Сообщений: 686 Регистрация: 8.2.2006 Где: Екатеринбург Репутация: 33 Всего: 81 |
Создавайте объекты ObjectInputStream и ObjectOutputStream единожды при получении соответствующих Stream'ов из сокета, как на сервере так и на клиенте.
|
|||
|
||||
| COVD |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 17 Всего: 43 |
В большинстве учебниках как правило приводится пример когда создается соединение, создаются стримы и демонстрируется однократная пересылка обьекта. Все замечательно. Учебные примеры очевидно предполагают для каждого нового обьекта создавать новое соединение и новый стрим. Но, как правильно выше отметил ivq, все же хотелось бы использовать одно соединение и одну пару стримов. И тогда, после успешной пересылки первого обьекта , при попытке переслать второй обьект через то же соединение пользователь обнаруживает упомянутые выше гадости. А все потому , что в замечательных примерах не сказано, что надо использовать метод reset() всякий раз после записи обьекта :
А не пишут про это авторы учебников исключительно для того, чтобы побудить программистов использовать RMI. |
|||
|
||||
| Fieral |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 250 Регистрация: 10.12.2007 Репутация: нет Всего: 1 |
COVD - не помогло.
ivg - собсно тема какраз о том что это не работает, будте внимательны. --------------------
Если собака свернулась калачиком, значит будет дождь, а если сидит выпучив глаза, значит у неё запор. |
|||
|
||||
| ivg |
|
|||
![]() Autonomous R&D ![]() ![]() Профиль Группа: Участник Сообщений: 686 Регистрация: 8.2.2006 Где: Екатеринбург Репутация: 33 Всего: 81 |
||||
|
||||
| Fieral |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 250 Регистрация: 10.12.2007 Репутация: нет Всего: 1 |
это ресивер, сендер аналогичен, но если нужно - выложу остальной код завтра (как до работы дойду) код:
--------------------
Если собака свернулась калачиком, значит будет дождь, а если сидит выпучив глаза, значит у неё запор. |
|||
|
||||
| ivg |
|
|||
![]() 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'а, для которого сендер уже был создан).
|
|||
|
||||
| Fieral |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 250 Регистрация: 10.12.2007 Репутация: нет Всего: 1 |
Спасибо ivg!
Я был уверен на 99.9%, что не создаётся лишний сендер, но совесть сказала что 99.9% - мало, поэтому я ещё раз скурпулёзно прочесал весь проект и, таки, нашел засранца. --------------------
Если собака свернулась калачиком, значит будет дождь, а если сидит выпучив глаза, значит у неё запор. |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |