Передача различных данных клиент-сервер-клиент

Программирование, которое не связано с API и Flash.

Передача различных данных клиент-сервер-клиент

Сообщение Апчхи » 05 июн 2014, 17:37

Опору при написании кода делал вот на этот урок: http://flapps.ru/forum/topic7181.html

Теперь про собственно проблему:
Вот так происходит упаковка данных:
 Упаковка кода
  1. function vidpravka(e:Event):void {
  2.     var danniSoket:Object = ({igrok: "Gravec", kordX: гравець.x, kordY: гравець.y});
  3.     var otpravka = JSON.stringify(danniSoket);
  4.     // массив байт для посылки...
  5.     var sendBytes:ByteArray = new ByteArray();
  6.            
  7.     // байты самого сообщения...
  8.     var mBytes:ByteArray = new ByteArray();
  9.     // запишем сюда строку...
  10.     mBytes.writeUTFBytes(otpravka);
  11.            
  12.     // запишем блину сообщения...
  13.     sendBytes.writeInt(mBytes.length);
  14.     // запишем сам массив байт сообщения...
  15.     sendBytes.writeBytes(mBytes);
  16.            
  17.     // отошлем байты...
  18.     socket.writeBytes(sendBytes);
  19.     socket.flush();
  20. }


Файл сокета я взял из урока, заменив только из файла Server.java рядки 62 и 66, вместо message прописал danniSoket; в 158-м рядке Client.java проделал то же.

Код приёма и обработки:
 Обработка и вывод
  1. function readMessage():void {
  2.     // если в буфере меньше длина сообщения, чем нужная длина -
  3.     // ждем получения данных...
  4.     if(_buffer.length < _buffer.position + _length) return;
  5.            
  6.     // читаем сообщение...
  7.     var user_message:String = _buffer.readUTFBytes(_length);
  8.            
  9.     // если в буфере нет данных после считывания сообщения
  10.     // и разделителя - очистим его...
  11.     // если есть - очистим в следующий раз :)
  12.     if(_buffer.bytesAvailable == 0) _buffer.clear();
  13.                
  14.     // если мы тут - сообщение нормально пришло...
  15.     // декодируем сообщения..
  16.     var decodedMessage:Object = JSON.parse(user_message);
  17.    
  18.     // теперь выводим сообщение...
  19.     var gravOnl:String = decodedMessage.danniSoket.igrok;
  20.     var gravOnlkordX:Number = decodedMessage.danniSoket.kordX;
  21.     var gravOnlkordY:Number = decodedMessage.danniSoket.kordY;
  22.     inf1.text = String(gravOnlkordY);
  23.     var pers:Gravec = new Gravec();
  24.     pers.x = gravOnlkordX;
  25.     pers.y = gravOnlkordY;
  26.     addChildAt(pers, 5);
  27.            
  28.     // тут все ок, значит изменим состояние на ожидание длины...
  29.     _state = READ_LENGTH;
  30. }


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

 
Автор темы
Сообщения: 79
Зарегистрирован: 26 авг 2013, 23:12
Благодарил (а): 14 раз.
Поблагодарили: 0 раз.

Чтобы убрать блок с рекламой, зарегистрируйтесь на форуме или войдите.

Google
 



Re: Передача различных данных клиент-сервер-клиент

Сообщение sasha^ » 05 июн 2014, 20:55

ты немного запутался в том что такое JSON :)
клиенту(flash) глубоко наплевать какое имя переменной было у другого клиента...
т.е. обращайся как decodedMessage.igrok
если других ошибок нет то заработает...

ps. приятно знать что мои уроки кому-то пригодились :)
sasha^

 
Сообщения: 711
Зарегистрирован: 10 сен 2012, 16:52
Благодарил (а): 1 раз.
Поблагодарили: 136 раз.

Re: Передача различных данных клиент-сервер-клиент

Сообщение Апчхи » 06 июн 2014, 12:45

Спасибо за указание, полезно. Но нашел ещё одну неточность, которую не знаю как решить:
Проверяя работоспособность кода с помощью функции обнаружил, что после строки проверка не работает. Начал разбираться, и вот к чему дошел:
Если код написан в классе, то он работает и так:

А вот если написан в кадре (как написал я), то вот как:
  1. var decodedMessage:Object = JSON.parse(e.target.data);

Но если я пропишу так как надо, то кол-во аргументов, которые ожидается и полученное, не совпадает, т.е. при вызове функции нужно прописать не readMessage(), а что-то другое. Только вот что? Попробовал некоторые вариации, не получилось, можете подсказать?
Апчхи

 
Автор темы
Сообщения: 79
Зарегистрирован: 26 авг 2013, 23:12
Благодарил (а): 14 раз.
Поблагодарили: 0 раз.

Re: Передача различных данных клиент-сервер-клиент

Сообщение sasha^ » 06 июн 2014, 15:33

А вот если написан в кадре (как написал я)

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

 
Сообщения: 711
Зарегистрирован: 10 сен 2012, 16:52
Благодарил (а): 1 раз.
Поблагодарили: 136 раз.

Re: Передача различных данных клиент-сервер-клиент

Сообщение Апчхи » 06 июн 2014, 16:04

Увы, переделывать в классы - это долго( Можно хотя б наброски, что бы иметь представление, что и как?
Апчхи

 
Автор темы
Сообщения: 79
Зарегистрирован: 26 авг 2013, 23:12
Благодарил (а): 14 раз.
Поблагодарили: 0 раз.

Re: Передача различных данных клиент-сервер-клиент

Сообщение sasha^ » 06 июн 2014, 16:26

Увы, переделывать в классы - это долго( Можно хотя б наброски, что бы иметь представление, что и как?

нет..долго.. просто скажу:
1) измени private на public
2) делегируй все задачи классу

Если код написан в классе, то он работает и так:
var decodedMessage:Object = JSON.parse(user_message);

А вот если написан в кадре (как написал я), то вот как:
var decodedMessage:Object = JSON.parse(e.target.data);

потому-что класс имеет доступ к его членам.. кадр - нет, потому он берет данные из цели события(сокета), так можно и в классе сделать, но тогда код запутается. а суть ооп в том чтобы сделать проще...

UPD: как вариант перепиши класс в функции(под кадр) и все будет работать...=))
sasha^

 
Сообщения: 711
Зарегистрирован: 10 сен 2012, 16:52
Благодарил (а): 1 раз.
Поблагодарили: 136 раз.

Re: Передача различных данных клиент-сервер-клиент

Сообщение Апчхи » 06 июн 2014, 17:03

По второму пунктику хочу сделать уточнение:
все переменные прописать и заполнить данными, файл класса в одной директории из исходником, из кадра обращаться вот так:
  1. var dopKlass:Main = new Main();
  2. var koordinata:Number = dopKlass.decodedMessage.kordX;

Я правильно понял?
Апчхи

 
Автор темы
Сообщения: 79
Зарегистрирован: 26 авг 2013, 23:12
Благодарил (а): 14 раз.
Поблагодарили: 0 раз.

Re: Передача различных данных клиент-сервер-клиент

Сообщение sasha^ » 06 июн 2014, 17:58

По второму пунктику хочу сделать уточнение:
все переменные прописать и заполнить данными, файл класса в одной директории из исходником, из кадра обращаться вот так:

нет. не правильно понял.. :)
сделай так чтобы класс или слал событие и подпишись на него из кадра.. или сделай так, чтобы класс вызывал фукнцию-обработчик из кадра... т.е. что-то вроде этого...
  1. // код класса
  2. // тут объявление переменных...
  3. public var _messageFunc:Function = null;
  4. // тут тоже код класса...
  5. private function readMessage():void {
  6. //... тут код ф-ции..получаем данные...
  7. var decodedMessage:Object = JSON.parse(user_message);
  8. // теперь если  есть ф-ция обработчик - передадим в нее...
  9. if(_messageFunc != null) _messageFunc(decodedMessage);
  10. // тут дальше код ф-ции
  11. }
  12. // опять код класса...
  13.  
  14. // код в кадре
  15. var obj:Main = new Main();
  16. // твоя супер-функция обработки...
  17. function myfunc(json:Object):void {
  18. trace(json.kordX);
  19. }
  20. obj._messageFunc = myfunc;
  21.  
sasha^

 
Сообщения: 711
Зарегистрирован: 10 сен 2012, 16:52
Благодарил (а): 1 раз.
Поблагодарили: 136 раз.

Re: Передача различных данных клиент-сервер-клиент

Сообщение Апчхи » 06 июн 2014, 18:22

Спасибо! :)
Апчхи

 
Автор темы
Сообщения: 79
Зарегистрирован: 26 авг 2013, 23:12
Благодарил (а): 14 раз.
Поблагодарили: 0 раз.


Вернуться в Программирование на PHP и других языках (без использования API)



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0

cron