PDA

Просмотр полной версии : передача в socket


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

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

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

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

Добавлено через 19 минут

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
Это 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.
Алгоритм я думаю правильным такой, от нажатия мышки до отпускания собрать то что происходило с координатами в массив...
А вот как собрать это в массив....



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 минут
Читаю статью, интересно.




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();
}
//// отправка данных




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

caseyryan
08.11.2015, 12:37
Или реально столько много нельзя отправлять?
Ни один, даже самый крутой хостинг в мире, такого пинга-то не даст) Максимум раз 10 в секунду можно что-то отправить (в лучшем случае), так как пинг в среднем около 100 мс везде, плюс / минус несколько мс. Добавь к этом время на обработку каждого запроса на сервере + время отправки до другого клиента и получаешь максимум 5 - 6 реально работающих запросов в секунду. И это еще при учете того, что сервер не перегружен (я не один месяц убивал на оптимизацию запросов, чтобы все хорошо работало и не тормозило. А тут 5й день. Для 5ти дней резуьтат очень даже не плохой, кстати)

Самый логичный способ делать такое взаимодействией - это копить данные где-то на клиенте (к примеру в массиве) и отправлять только измененные и не по энтер фрейму, а, к примеру по таймеру, который тикает раз 5 - 8 в секунду.
А что если тот, кто рисует, призадумался и задержал мышку на месте? На кой слать на сервер одни и те же запросы. Их нужно фильтровать в дополнение ко всему. Записывать последний запрос и сравнивать с тем, что должен быть отправлен на сервер. Если они совпадают - ничего не слать.

exsites
09.11.2015, 07:19
Спасибо:-))
Я сделал проще. Я не фильтрую ничего. У меня данные собираются в массив, и как только мышка отпущена они отправляются в сокет. Все получилось офигенно, все работает. Все в одном фрейме. С фреймами это я так, шутил. Они для мультиков скорее. Зато узнал как найти текущий фрейм:-)))))
Но вот есть у меня один ступор...

У меня схема такая.

Учитель -> сокет -> ученики.


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

По мимо рисовалки там еще есть показ слайдов. Естестно 2 кнопки -> включить слайды, (доска отключается) включить доску (слайды отключаются). По мимо доски и слайдов висит видеоплеер где ученики видят учителя..

Так вот когда я кнопками потыкаю туда сюда, в трейсе с каждым "туда сюда" дублируются массивы.. В принципе в сокет уходит один, и можно бы по идее забить.... но в трейсе глаз мазаолит...

Отсюда вопрос:
Есть смысл бороться с этим, или забить?

В принципе туда сюда за урок ну раза 3-4-5 будет.. Не так уж их и много скопится в памяти.

caseyryan
09.11.2015, 07:35
Надо полагать это все написано в разных кадрах?
Если да, то нужно как минимум перенести все в один (если о классах речь не вести).
Код в кадрах - это всегда зло. При переключении с одного кадра на другой, код из более раннего кадра ничего не знает от слудующем
и как только мышка отпущена они отправляются в сокет
Ну, такое можно реализовать и простыми http запросами, без сокетов

Psycho Tiger
09.11.2015, 11:31
Ну, такое можно реализовать и простыми http запросами, без сокетов
А принимать данные long-poll'ом? )

caseyryan
09.11.2015, 11:38
Зачем? Опрашивать сервер так же гет или пост запросами с определенными интервалами на предмет изменений

ZackMercury
09.11.2015, 16:28
Код в кадрах - это всегда зло.
Любите вы пофлудить, товарищ :)
В кадрах вполне себе можно написать сложный клиент-серверный проект, если не разбивать код на разные кадры и делать всё в одном кадре. Другое дело, что это неудобно и некрасиво, особенно, если пользоваться чужими библиотеками.
exsites, если у вас есть сомнения в квалификации людей, которые вам отвечают - зачем вы спрашиваете на форуме? Пользуйтесь литературой и справкой. Я уверен, что с вашей уверенностью в своей правоте вы решите все свои проблемы сами.
Все желают вам только зла и хотят запутать вас, но вы продолжаете с ними советоваться, при этом ещё и выражая недовольство с агрессией в адрес тех, кто пытается поставить вас на верный путь.

exsites
09.11.2015, 22:55
Надо полагать это все написано в разных кадрах?
Нет, все написано в одном кадре.
Ну, такое можно реализовать и простыми http запросами, без сокетов
Не, аякс тут курит нервно.


при этом
проигнорирую ваше сообщение, не вижу смысла отвечать ни на что.



Вопрос был про массивы.
Есть смысл бороться с этим, или забить?

КорДум
10.11.2015, 13:07
Очевидно, что такую архитектуру приложения следует править, потому как
Так вот когда я кнопками потыкаю туда сюда, в трейсе с каждым "туда сюда" дублируются массивы
говорит о некорректном поведении программы. Почему массивы дублируются? Удаляйте старый ненужный перед переходом на слайд. Или оставляйте его, если он нужный, тогда не создавайте новый. Честно говоря, тут помощь по своей масштабности уже выходит за рамки данной темы и начинает напоминать битву телепатов. Попробуйте устранить текущую некорректность самостоятельно, направляющие советы для этого я дал. Либо оформите новую тему с данной проблемой и распишите все подробно с кусками кода и комментариями.

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

Вдогонку, все-таки, почитайте тематическую литературу по ООП, чтобы отойти от плохой привычки писать околопроцедурный код в кадрах. Как говорили тут на форуме: кадры — для баннеров.

caseyryan
10.11.2015, 20:54
Не, аякс тут курит нервно.


Уже второй раз про AJAX и второй раз мимо цели)
AJAX - asynchronous javascript and xml
Эта технология не имеет ничего общего с флешем, и с теми http запросами, про которые я говорил. А если взять только похожесть принципа работы, то нифига он не курит в сторонке. Все это можно легко реализовать запросами, без написания более сложных socket серверов

exsites
12.11.2015, 01:37
Вы наверное что-то не понимаете в работе аякса. Вам нужен лишний трафик в виде заголовков? Мне нет.

Psycho Tiger
13.11.2015, 17:32
Заголовков... У AJAX'а нет, заголовков? Что? :D

caseyryan упруго заметил, что J stands for Javascript. В AS тогда уж AAAX, но нет такого термина.

КорДум
13.11.2015, 19:18
Ну относительно топикстартер прав, хотя и не понимает, что говорит: HTTP запросы навешивают на себя ряд обязательных заголовков, кои можно избежать путем использования байтового протокола в чистом сокетном сервере. Собственно, глупо постоянно спамить сервер онлайн рисовалки, несмотря на малое количество передаваемых данных в текущей задаче. Однако, учитывая, что топикстартер задает достаточно простые "низкоуровневые" вопросы, такие как "запись истории мыши в массив", — реализация рисовалки на HTTP запросах будет действительно упрощением, тем более, что заголовки не гигабайтами и даже не килобайтами меряются и в целом никаких синхронизаций по тикам тут нафиг не надо.