Форум программистов, компьютерный форум, киберфорум
Java EE (J2EE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
0 / 0 / 0
Регистрация: 26.11.2010
Сообщений: 16

Java сервер Flash клиент java.io.StreamCorruptedException: invalid stream header

11.08.2015, 00:21. Показов 3861. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть класс сериализованный на стороне java (сервер) и actionscript(клиент). При попытке передачи объекта от клиента к серверу вылетает java.io.StreamCorruptedException: invalid stream header (Сериализованные классы между собой идентичны. Для сериализации были использованы IExternalizable и Externalizable.)
Вопрос как победить проблему? Почитал про сериализацию и там и там, но не смог найти ответа, как сделать, что бы работало.

Код сервера
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
     public class JabberServer {
    public static final int PORT = 2525, PORT_MAJOR=8100;
    static DataOutputStream outdata;
    static DataInputStream indata;
    public static void sendFileSecurity()throws Exception{
        ServerSocket socketserver = new ServerSocket(PORT);
        Socket client = socketserver.accept();
 
        FileInputStream xmlFile = new FileInputStream("src/files/crossdomain.xml");
        int xmlBytesCount = xmlFile.available();
 
        byte[] xmlBytes = new byte[xmlBytesCount + 1];
        xmlFile.read(xmlBytes, 0, xmlBytesCount);
        xmlBytes[xmlBytesCount] = 0;
        xmlFile.close();
        byte[] policyRequest = new byte[23];
        indata = new DataInputStream(client.getInputStream());
        outdata = new DataOutputStream(client.getOutputStream());
        indata.read(policyRequest,0,23);
        outdata.write(xmlBytes, 0, xmlBytesCount + 1);
        outdata.flush();
        outdata.close();
        System.out.println(":: FSS :: Policy sended to " + client.toString());
        System.out.println(xmlBytes.toString());
    }
 
    public static void main(String[] args) throws Exception{
       sendFileSecurity();//отправка файла политики
 
        Sprinter spr = new Sprinter();  // сериализованый класс на стороне клиента и сервера
        ServerSocket socket = new ServerSocket(PORT_MAJOR);
 
        System.out.println("Started:" + socket);
        try{
            Socket s = socket.accept();
            try {
                System.out.println("Connection: " + s);
               
                // на данном этапе происходит ошибка
                ObjectInputStream in = new ObjectInputStream(s.getInputStream());
 
                ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream());
                System.out.println("create in i/o server" + s.isConnected());
               // сериализованый класс на стороне клиента и сервера
               Sprinter str = new Sprinter();
                int i=0;
                    while(i<1)   {
 
                       out.writeObject(spr);
                        out.flush();
                        System.out.println("In while");
                        str = (Sprinter)in.readObject();
                        System.out.println(str);
                        i++;
                    }
 
            }finally {
                s.close();
            }
        }
 
        catch (Exception e){
            e.printStackTrace();
        }
        finally {
            socket.close();
        }
    }
}
код клиента
ActionScript 3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public class MyXmlSocketConnection {
    public function MyXmlSocketConnection() {
    }
 
    private var test_object: Object
    private var xmlsocket : XMLSocket;
    private var PORT: int = 2525, PORT_MAJOR: int = 8100;
    private var sprinter: Sprinter = new Sprinter();// сериализованный класс
    public function connect():void{
 
        xmlsocket = new XMLSocket();
        xmlsocket.connect("127.0.0.1",PORT);
        Security.loadPolicyFile("xmlsocket://server.com:2525");
        xmlsocket.connect("127.0.0.1", PORT_MAJOR);
        configureListeners(xmlsocket);
 
    }
 
    private function configureListeners(dispatcher:IEventDispatcher):void
    {
 
        dispatcher.addEventListener(Event.CONNECT, connectHandler);
        dispatcher.addEventListener(DataEvent.DATA, dataHandler);
    }
    private function connectHandler(event:Event):void {
         xmlsocket.send(sprinter);
        Alert.show("connectedHandler "+xmlsocket.connected );
    }
    private function dataHandler(event:DataEvent):void
    {
        Alert.show("DataHandler");
    }
 
}
 
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.08.2015, 00:21
Ответы с готовыми решениями:

Java.io.StreamCorruptedException: invalid stream header
Изучаю клиент серверное взаимодействие на сокетах. Сейчас стоит задача на подключение новых клиентов к серверу и отправление списка...

Java.io.StreamCorruptedException: invalid type code: AC
Моя задача - написать игру PONG и сделать ее онлайновой. Через некоторое время работы клиента появляется исключение...

Сервер клиент: Java DataInput(Output)Stream + Socket
Всем привет! Интересует как отслеживать отключился ли клиент от сервера, вдруг клиент закрашился, а конект то остается в сервере. В C#...

6
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
11.08.2015, 00:43
gapo, почему бы не использовать json? Так объекты будут гарантированно совместимы. Я не очень представляю как будут совместимы классы разных языков.
0
0 / 0 / 0
Регистрация: 26.11.2010
Сообщений: 16
11.08.2015, 00:53  [ТС]
KEKCoGEN, Очень охота разобраться в этом. Ну совместимость классов (если верить докам) не особо проблема. Аdobe пишет, что достаточно сериализовать точно такой же класс через интерфейсы Externalizable и IExternalizable соответственно главное, что бы порядок сериализации в переопределенных методах совпадали и свойства классов совпадали. Проблема именно в передачи. И вот тут не знаю как решить задачу. Если не использовать Blazeds для интеграции одного с другим. Но народ пишет в тырнетах, что можно только не пишет как((
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
11.08.2015, 08:02
gapo,
Цитата Сообщение от gapo Посмотреть сообщение
что достаточно сериализовать точно такой же класс через интерфейсы Externalizable и IExternalizable
интерфейса IExternalizable в стандартных либах джавы вообще нет
Externalizable насколько я знаю дает кастомный контроль за процессом сериализации\десериализации. Покажите как у вас в джава коде описаны его методы для класса Sprinter.

PS нашел статью Adobe которую вы читали думаю. Там говорят что интерфейсы впринципе совместимы. Покажите как вы имплементировали методы writeExternal на стороне клиента и readExternal на стороне сервера. На самом деле то что вы делаете это извращение нужное в сугубо специфичных случаях. На вашем месте я бы слал json.
1
0 / 0 / 0
Регистрация: 26.11.2010
Сообщений: 16
11.08.2015, 09:29  [ТС]
KEKCoGEN,

"На самом деле то что вы делаете это извращение нужное в сугубо специфичных случаях."

Ну любопытно же как оно должно взаимодействовать на прямую))
Вот код java
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Sprinter implements Externalizable {
    private static final int serialVersionUID =1;
    private int number_flex_ = 8;
    private String str_flex ="Java server" ;
      public Sprinter(){}
    @Override
    public void writeExternal(ObjectOutput out) throws IOException {
       out.writeObject(str_flex);
      out.writeInt(number_flex_);
    }
 
    @Override
    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
      str_flex = (String)in.readObject();
       number_flex_ = in.readInt();
    }
    @Override
    public String toString(){
        return " Line = " + str_flex +"\n"+ "Number = "+ number_flex_ ;
    }
}
AS3
ActionScript 3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[RemoteClass(alias="serializable.Sprinter")]
public class Sprinter implements IExternalizable{
    private static  const serialVersionUID: int =1;
    private var str_flex: String = "Flex";
    private var number_flex_: int = 1;
    public function Sprinter() {
    }
    public function writeExternal(output:IDataOutput):void {
        output.writeObject(str_flex);
        output.writeInt(number_flex_);
    }
 
    public function readExternal(input:IDataInput):void {
       str_flex = input.readObject() as String;
        number_flex_ = input.readInt();
    }
     public function toString():String{
         return "Line Flex = "+ str_flex + " Number = "+number_flex_;
     }
}
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
11.08.2015, 09:49
gapo, ставьте дебаг на readExternal и смотрите что пришло в ObjectInput и как можно оттуда читать. По коду в теории вроде верно.

Цитата Сообщение от gapo Посмотреть сообщение
как оно должно взаимодействовать на прямую
что значит напрямую? Сериализация это просто некий формат представления класса. В данном случае как последовательность байтов. В json как некая другая последовательность. Сериализация работает несколько быстрее и имеет меньший размер передачи однако для вашего случая это совсем неважно.
1
0 / 0 / 0
Регистрация: 26.11.2010
Сообщений: 16
11.08.2015, 12:57  [ТС]
KEKCoGEN, Вся беда в том, что до метода чтения он не доходит ошибка: java.io.StreamCorruptedException: invalid stream header
Говорит о том, что пришедший объект не соответствует тому потоку, который принимает. Тобишь заменяю на
BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
и все будет работать, но не с объектами. Поправьте если ошибаюсь.


Спасибо за ответы. Скорее всего приду либо к json либо свяжу их через blazeds
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.08.2015, 12:57
Помогаю со студенческими работами здесь

Java socket StreamCorruptedException
Доброго времени суток! Товарищи, уже какой день не могу понять в чем проблема. Часто появляются разные ошибки. В особенности...

Клиент на Си сервер на Java
Всем привет! Подскажите, как соединить клиента написанного на C с сервером на Java .можно ссылку на простенький пример

Клиент на C++ сервер на Java
Привет, подскажите пожалуйста Имеется клиент на C++ и сервер на Java. Запускаем сервер и он ждет когда клиент отправит ему файл. После...

Клиент и сервер на java
Нужно написать приложения клиент и сервер, которые обмениваются пакетами. Написал приложения, которые обмениваются простым текстом. Каким...

Клиент/Сервер Java
Рассматриваю простой клиент-сервер. Клиент имеет текстовое поля для ввода и кнопку отправки, Сервер разбирает кодограммы, что то делает,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru