Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Серверные технологии и Flash (http://www.flasher.ru/forum/forumdisplay.php?f=62)
-   -   прослушка сокета в цикле (http://www.flasher.ru/forum/showthread.php?t=205167)

GrafMine 21.11.2013 17:00

прослушка сокета в цикле
 
собственно сразу код :
Код AS3:

trace("start _child_arrC: "+_child_arrC.length);
                                if(station_type=="income"){
                                        for (var i:Number=0; i < _child_arrC.length; i++) {
                                                var json_data:Object = new Object();
                                                json_data.method = "setEndToAction";
                                                json_data.params = {validation_key: v_key,stationId:int(_child_arrC.getItemAt(i).stationId),professionId:int(_child_arrC.getItemAt(i).professionId),userId:int(_child_arrC.getItemAt(i).UID),amount:int(_child_arrC.getItemAt(i).amount)};
                                                trace(JSONN.encode(json_data));
                                                socket.writeUTFBytes(JSONN.encode(json_data));
                                                socket.flush();
                                        }
                                        _child_arrC.removeAll();
                                        trace("end _child_arrC: "+_child_arrC.length);
                                }

В принципе все работает, но нужно как-то остановить цикл ,подождать пока сервер ответить и когда ответил крутануть следующую і++.
На деле выходит так что я со скоростью автомата на сервер даю три запроса и когда цикл отработал свое сервер мне дает ответ только на самый первый запрос остальные игноряться.
в идеале конечно было бы еще как-то реализовать если сервер не отвечает то повторить ему еще раз запрос, ну это уже только бонус к основному вопросу) он не сильно важен сейчас )

alexcon314 21.11.2013 21:49

Почему бы все за раз не послать? Мне непонятно, зачем намернно бить-дробить отсылаемые данные на несколько запросов в вашем случае.

GrafMine 21.11.2013 22:15

Цитата:

Сообщение от alexcon314 (Сообщение 1153265)
Почему бы все за раз не послать?

как ?)
а вообще я так понял вопрос актуальный я много видел вопросов в инете подобных без ответов...

caseyryan 21.11.2013 22:55

Цитата:

как ?)
Что как? Поместить все нужные данные в массив, его сериализовать в джейсон и отрпавить за раз
Цитата:

но нужно как-то остановить цикл ,подождать пока сервер ответить и когда ответил крутануть следующую і++.
В ас3 это невозможно. Он не многопоточен, и такая "остановка" одного цикла приведет к остановке всей программы

C4Grey 21.11.2013 23:49

Отправлять сообщение, ждать ProgressEvent.SOCKET_DATA после отправлять следующее - это если важна очередность отправки. Можно таким образом организовать стек сообщений, можно каждому сообщению добавить UID, для проверки ответа от сервера. Кода приема сообщений нету(также как и кода сервера, отвечающего за их отправку), потому сложно сказать почему клиент получает только одно сообщение. Что касается проверки "сервер не отвечает" - после зкарытия серверного сокета Flash вызовет событие Event.CLOSE у сокета, то же справедливо и для обрыва соединения на стороне клиента. Конечно, никто не мешает пинговать клиентов с определенным интервалом, и проверять время пинга на клиенте - если больше определенного - закрывать подключение и уведомлять об ошибке. Все остальное, что не касается разрыва соединения(падение сервера вследствие утечек памяти, ошибки в логике обработки сообщений, и т.п.) относится к багам, IMHO, и это нужно чинить в коде, а не городить вокруг костыли.

bifidokk 22.11.2013 08:55

Цитата:

Сообщение от GrafMine (Сообщение 1153268)
как ?)
а вообще я так понял вопрос актуальный я много видел вопросов в инете подобных без ответов...

и я спрошу, зачем это делать?)
если сервер не успевает что-то там обработать, то нужно там стек организовывать. или менять серверный движок :)

GrafMine 22.11.2013 16:23

Проблема была решена другим путем, ну все равно каждого по отдельности.
Цитата:

Сообщение от caseyryan (Сообщение 1153272)
Что как? Поместить все нужные данные в массив, его сериализовать в джейсон и отрпавить за раз

Как сделать например с моим примером - 3 раза запихнуть параметры в массив потом его сериализовать в джейсон и отправить ? я как только не извращался одни матюки дебаг пишет ) и в инете написано только как запрос в массив преобразовать а массив уже протрейсить, а вот обратное действие что-то сложно понимаеться.

alexcon314 22.11.2013 17:27

Типа вот так, не?
Код AS3:

if(station_type=="income"){
        var json_data:Object = new Object();
        json_data.method = "setEndToActionForChilds";// метод, принимающий массив объектов
        var params:Array = new Array();//собственно, сам массив
        for (var i:Number=0; i < _child_arrC.length; i++) {
                params.push({validation_key:v_key,stationId:int(_child_arrC.getItemAt(i).stationId),professionId:int(_child_arrC.getItemAt(i).professionId),userId:int(_child_arrC.getItemAt(i).UID),amount:int(_child_arrC.getItemAt(i).amount)});
        }
        json_data.params = params;
        socket.writeUTFBytes(JSONN.encode(json_data));
        socket.flush();
        _child_arrC.removeAll();
}

Понятное дело, на сервер придет весь массив из трех объектов сразу, там нужно будет его соответственно обработать. Т.е. можно действие setEndToAction применить ко всем объектам в отправленном массиве, например.

GrafMine 22.11.2013 20:47

Цитата:

Сообщение от alexcon314 (Сообщение 1153330)
Типа вот так, не?
Код AS3:

if(station_type=="income"){
        var json_data:Object = new Object();
        json_data.method = "setEndToActionForChilds";// метод, принимающий массив объектов
        var params:Array = new Array();//собственно, сам массив
        for (var i:Number=0; i < _child_arrC.length; i++) {
                params.push({validation_key:v_key,stationId:int(_child_arrC.getItemAt(i).stationId),professionId:int(_child_arrC.getItemAt(i).professionId),userId:int(_child_arrC.getItemAt(i).UID),amount:int(_child_arrC.getItemAt(i).amount)});
        }
        json_data.params = params;
        socket.writeUTFBytes(JSONN.encode(json_data));
        socket.flush();
        _child_arrC.removeAll();
}

Понятное дело, на сервер придет весь массив из трех объектов сразу, там нужно будет его соответственно обработать. Т.е. можно действие setEndToAction применить ко всем объектам в отправленном массиве, например.

Большое спасибо, действительно все оказалось проще некуда )


Часовой пояс GMT +4, время: 02:49.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.