Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   передача в socket (http://www.flasher.ru/forum/showthread.php?t=211791)

exsites 07.11.2015 15:09

передача в socket
 
Вообщем не знаю что делать. Надо передать информацию в сокет. Все хорошо передается но есть одно но!
Делаю рисовалку через сокет, она 90% отправленных данных теряет...
Заметил я это когда в чате пытался пофлудить.. Видимо какой-то есть в сокете затык на эту тему.
Отсюда напрашивается вывод, что надо как-то нарисованый объект от момента нажатия мыша до момента отпускания сохранить в буфер и после этого отправить в сокет... И так со следующим...

Есть в AS3 какие-то возможности для такого?? Если есть, отправьте куда надо:-)) Может у кого есть готовое решение?

caseyryan 07.11.2015 15:17

Цитата:

Видимо какой-то есть в сокете затык на эту тему.
Нет там никакого затыка. Можно отправлять всё что угодно. Если не отправляется, значит в коде что-то не верно, либо на сервере, либо на клиенте.

exsites 07.11.2015 15:27

Любите пофлудить? Все отправляется, но если отправлять 100 пакетов в секунду то 90% теряется.
Попробуйте увидите.

Добавлено через 19 минут
Код AS1/AS2:

                var command:String = sendVar;
                // создаем байтовый массив из строки
                var pack:ByteArray = new ByteArray();
                pack.writeUTFBytes(command);
                // помещаем позицию байтового массива в занчение 0
                pack.position = 0;
                //
                // отправляем в сокет длину пакета
                socket.writeShort(pack.length);
                // отправляем в сокет сам пакет
                socket.writeBytes(pack);
                socket.flush();

Возможно тут что-то теряется...? сделал трейс, все что пишется подготавливается к отправке и отдается в sendVar.... а дальше до сервера не доходит...

caseyryan 07.11.2015 16:47

Цитата:

Любите пофлудить?
Судя по количеству ваших тем, это вы, товарищ, пофлудить любите. Вместо того, чтобы почитать полезную инфу на эту тему, или вообще научиться правильно темы создавать.
Все ваши темы звучат примерно так: "У меня что-то не работает, объясните почему. Но только по теме!" И пофиг что эта тема для телепатов.
Я могу с уверенность сказать, что я делал реалтаймовые игры на сокетах, и у меня ничего не тярелось. Точнее сказать потери в сети всегда возможны, но точно не в таких объемах. Отправлять по 100 пакетов в секунду - явный перебор. Это DDOS бот что ли?)

Надо делать буфер, копить какую-то инфу, и после этого отправлять. 100 раз в секунду слать что-то на сервер точно не нужно.

EndoCrinologist 07.11.2015 18:08

Цитата:

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

exsites 07.11.2015 18:20

Цитата:

Сообщение от caseyryan (Сообщение 1188794)
Это DDOS бот что ли?)

Вы читать умеете?
Рисовалка!!! Она по движению мыши создает координаты! Координат этих туева хуча. Эти координаты я отправляю на сервер!
Где я написал что у меня что-то не получается? Я спросил какие варианты реализации, потому что по сути получается ддос.. МОжет кстати по этому и теряются пакеты.

Как реализовать буфер на as3? покажите пример? И до кучи вашу игру которую вы сделали, поиграю.:-))

udaaff 07.11.2015 18:36

Цитата:

Любите пофлудить?
Цитата:

Вы читать умеете?
Не нужно вести общение с участниками форума в таком тоне.

exsites 07.11.2015 20:54

извините

Добавлено через 58 секунд
подкиньте идею как записать движение мыша в массив???

КорДум 07.11.2015 21:17

А как получаются 100 пакетов в секунду? Что-то я при всем желании не могу это представить.
Алгоритм, который сходу придумывается: в течение N кадров/секунд записываете историю рисования (риализовываете через массив с экземплярами кастомного класса с историей), затем после этого отправляете полученный массив координат и действий в пакете.

По истории посоветую сделать базовый класс, от него отнаследовать классы типа ChangeColorHistory, MouseDownHistory, MouseUpHistory, MouseMoveHistory и тд. Затем сериализуете каждую частичку истории и добавляете в пакет. По сокетам посоветую свои давнишние статьи, может быть подмогнут где-то с чем-то:
http://www.flasher.ru/forum/blog.php?b=579

exsites 07.11.2015 22:01

Да я попробовал отправлять все изменения координат мыша через сокет... если мышкой медленно рисовать, то все рисуется. если быстро, то пакеты теряются и вместо круга квадрат получается.

Я в AS всего 5 день что-то делаю и во Flash CS6 поэтому про классы я не ведаю. Пишу в IDE.
Алгоритм я думаю правильным такой, от нажатия мышки до отпускания собрать то что происходило с координатами в массив...
А вот как собрать это в массив....

Код AS3:

 
        function startPic()
        {
 
        import flash.display.Shape;
        //Прорисовка линии
        var draw_line:Boolean = false;
        stage.addEventListener(MouseEvent.MOUSE_DOWN, MouseDown);
        stage.addEventListener(MouseEvent.MOUSE_UP, MouseUp);
        image_mc.addEventListener(MouseEvent.MOUSE_MOVE, MouseMove);
        //Фигура, в которую будут добавляться нарисованые линии
        var image:Shape = new Shape();
        //Устанавливаем Ширину, цвет и прозрачность линии (от 0 до 1)
        image.graphics.lineStyle(3, 0x000000, 1);
        //Добавляем фигуру в клип
        image_mc.addChild(image);
 
                //Нажатие ЛКМ
                function MouseDown(mouse:MouseEvent):void
                {
                        draw_line = true;
                        //Указываем точку откуда будем начинать рисовать линию
                        image.graphics.moveTo(mouse.localX, mouse.localY);
 
 
 
 
/// вот тут пошла первая точка в сокет
 
                        SendDataServer(mouse.localX,mouse.localY, 'st');
 
                }
 
                //Отпускание ЛКМ
                function MouseUp(mouse:MouseEvent):void
                {
                        //отключаем рисование линий
                        draw_line = false;
 
 
/// тут идет остановка в сокет
 
                        SendDataServer('', '', 'stop');
                }
 
                //Перемещение мыши над клипом image_mc
                function MouseMove(mouse:MouseEvent):void
                {
                        if (draw_line)
                        {
                                //Рисуем линию в точку, где находится курсор
                                image.graphics.lineTo(image.mouseX, image.mouseY);
 
 
/// пошло рисование в сокет
 
                                SendDataServer(mouse.localX,mouse.localY, 'on');
 
 
                                //Снова указываем точку откуда будем рисовать следующую линию
                                image.graphics.moveTo(image.mouseX, image.mouseY);
 
 
/// ну и тут соответственно опять в сокет
 
                                SendDataServer(mouse.localX,mouse.localY, 'tw');
                        }
                }
 
 
                function Clear():void /// очистим экран
                {
                        image.graphics.clear();
                        startPic();
                }
 
                btn_clear.addEventListener(MouseEvent.CLICK, Clear);
        }
startPic();

Вот рисовалка. Рисуешь медленно все рисуется как надо. Рисуешь быстро.... прямые линии. Какие координаты проскочили те и отрисовались..

А может у меня сокет криво работает?

Добавлено через 12 минут
Читаю статью, интересно.


Код AS3:

 
        function SendDataServer(a,b,c):void
        {
                /// переменные из текстового поля
                var sendPic = a +'x'+ b + 'x' + c;
 
                //trace(a,b,c);
 
                        var command:String = sendPic;
                        //trace (a);
 
                // создаем байтовый массив из строки
                var pack:ByteArray = new ByteArray();
                pack.writeUTFBytes(command);
                // помещаем позицию байтового массива в занчение 0
                pack.position = 0;
                //
                // отправляем в сокет длину пакета
                socket.writeShort(pack.length);
                // отправляем в сокет сам пакет
                socket.writeBytes(pack);
                socket.flush();
        }
        //// отправка данных


Гляньте, может у меня в отправке данных что-то не то? Или они там теряются на приеме?
Или реально столько много нельзя отправлять?


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

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