Передача массива через бинарный сокет

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

Передача массива через бинарный сокет

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

В продолжение темы http://flapps.ru/forum/topic7612.html:
Хочу совершить передачу массива числовых данных через бинарный сокет. Упаковка происходит вот так:
 Упаковка
  1. function send(e:Event):void {
  2.             // массив байт для посылки...
  3.             var sendBytes:ByteArray = new ByteArray();
  4.            
  5.             // байты самого сообщения...
  6.             var mBytes:ByteArray = new ByteArray();
  7.             // запишем сюда массив...
  8.             for (var i:int = 0; i < Danni.length; i++) {
  9.                 mBytes.writeUTFBytes(Danni[i++]);
  10.                 mBytes.writeFloat(Danni[i]);    
  11.                 trace("bytes.position is: " + mBytes.position);    
  12.             }
  13.            
  14.             // запишем блину сообщения...
  15.             sendBytes.writeInt(mBytes.length);
  16.             // запишем сам массив байт сообщения...
  17.             sendBytes.writeBytes(mBytes);
  18.            
  19.             // отошлем байты...
  20.             _socket.writeBytes(sendBytes);
  21.             _socket.flush();
  22.         }

Для полноты картины и проверки всё ли правильно. Есть проблема с обработкой данных в сокет-сервере. Он принимает данные типа String, но должен принимать double. Пробовал позаменять строки на теоретические нужные, результата не добился
 Начальные строки
  1. linkForServer.sendMessage((String)decoded_message.get("danniSoket"), uid);
  2. ....
  3. public void sendMessage(String danniSoket, long uid) throws Exception {
  4.         // json с сообщением...
  5.         JSONObject messageJSON = new JSONObject();
  6.         messageJSON.put("uid", uid);
  7.         messageJSON.put("danniSoket", danniSoket);
  8. ....

 Конечные строки
  1. linkForServer.sendMessage((double)decoded_message.get("Danni"), uid);
  2. ....
  3. public void sendMessage(double Danni, long uid) throws Exception {
  4.         // json с сообщением...
  5.         JSONObject messageJSON = new JSONObject();
  6.         messageJSON.put("uid", uid);
  7.         messageJSON.put("Danni", Danni);
  8. ....

Ну и как результат, запись в массив данных, из которого они и используются:
 Запись
  1. ...
  2. public var DanniM:Array
  3. ....
  4. var decodedMessage:Object = JSON.parse(user_message);
  5. for (var i:int = 0; i < decodedMessage.length; i++) {  
  6. DanniM[i] = decodedMessage.Danni[i];
  7.             }

В отказе передачи данных подозреваю сокет-сервер :lol:
Апчхи

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

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

Google
 



Re: Передача массива через бинарный сокет

Сообщение sasha^ » 16 июн 2014, 20:47

В отказе передачи данных подозреваю сокет-сервер :lol:

не дай боже тебе следователем работать.. обвинил блин невиновного :)
  1. function send(e:Event):void {
  2.             // массив байт для посылки...
  3.             var sendBytes:ByteArray = new ByteArray();
  4.            
  5.             // байты самого сообщения...
  6.             var mBytes:ByteArray = new ByteArray();
  7.             // запишем сюда массив...
  8.             for (var i:int = 0; i < Danni.length; i++) {
  9.                 mBytes.writeUTFBytes(Danni[i++]);
  10.                 mBytes.writeFloat(Danni[i]);    
  11.                 trace("bytes.position is: " + mBytes.position);    
  12.             }
  13.             // что за хрень? как ты массив записываешь?)))) ты читаешь json, а пишешь флоат?))) ппц...
  14.             mBytes.writeUTFBytes(JSON.stringify(Danni));
  15.             // все!!! массив json есть))))
  16.             // и да.. что за идиотский стиль давать названия переменных транслитом?) меня это бесит!!! как и многих кто отвечает на форуме..
  17.             // в следующий раз не отвечу=))
  18.            
  19.             // запишем блину сообщения...
  20.             sendBytes.writeInt(mBytes.length);
  21.             // запишем сам массив байт сообщения...
  22.             sendBytes.writeBytes(mBytes);
  23.            
  24.             // отошлем байты...
  25.             _socket.writeBytes(sendBytes);
  26.             _socket.flush();
  27.         }

За это сообщение автора sasha^ поблагодарил:
Апчхи
sasha^

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

Re: Передача массива через бинарный сокет

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

Точно! Я же JSON.stringify забыл!) Нужно исправить) :D
P.S. Про стиль: больше не буду
Изображение
Апчхи

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

Re: Передача массива через бинарный сокет

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

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

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

Re: Передача массива через бинарный сокет

Сообщение sasha^ » 16 июн 2014, 23:47

Да, и случаем, нет ли какой-то программы, для отслеживания данных подобного типа, что-то похожее на Charles?

wpe pro... ток там текст отслеживает хорошо... бинарные данные,amf и пр. точками показывает.. как и русские символы (кажись)...
+ отключай антивирус, а то он удаляет файлы программы... ведь чтобы сокеты слушать нужно внедрится в процесс... :)
http://dropmefiles.com/Z3XGr вот временная ссылка.. хранится не долго.. поспеши)))
sasha^

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

Re: Передача массива через бинарный сокет

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

Не могу я настроить передачу массивов :(
Порылся в документации, как оказалось put не может передавать массивы(
В общем, подправил файл сервера, согласно документации, но при запуске в ВК ни сообщения про соединение, ни авторизации нет; хотя при компиляции про соединение сообщается и про провал авторизации, что вполне обычно. Прошу направить на путь истины:
  1. // импортируем классы для работы с потоками
  2. import java.io.*;
  3. // импортируем классы для работы с сокетами
  4. import java.net.*;
  5. // импортируем классы для работы с буферами, потоками, получением байтов от значений и т.д.
  6. // т.е. new io - новый input output... именно тут класс ByteBuffer
  7. import java.nio.*;
  8. // импортируем Vector - массив автоматической длины...
  9. import java.util.Vector;
  10. // классы для работы JSON
  11. import org.json.simple.*;
  12. import org.json.simple.parser.*;
  13.  
  14. public class Server {
  15.     // порт для работы сервера...
  16.     public static final int PORT = 17030;
  17.    
  18.     // айди приложения...
  19.     public static final long APP_ID = 4039028;
  20.    
  21.     // ключ приложения...
  22.     public static final String APP_SECRET = "afgymaF4fWilS4RTpvKg";
  23.    
  24.     // сокет для принятия соединений...
  25.     private ServerSocket serverSocket;
  26.    
  27.     // массив клиентов...
  28.     private Vector<Client> clients;
  29.    
  30.     // конструктор...
  31.     public Server() throws Exception {
  32.         try {
  33.             // созданим вектор - массив автоматической длинны для клиентов...
  34.             clients = new Vector<Client>();
  35.            
  36.             // создадим серверный сокет...
  37.             serverSocket = new ServerSocket(Server.PORT);
  38.            
  39.             // напишем что сервер запускается
  40.             out("Server start...");
  41.            
  42.             // ждем подключений бесконечно...
  43.             while(true) {
  44.                 // ждем подключений... поток блокируется...
  45.                 Socket newClient = serverSocket.accept();
  46.                
  47.                 // мы получили подключение... теперь создадим класс Client
  48.                 // и запишем его в массив клиентов..
  49.                 out("New client connected... Online: " + (clients.size()+1) );
  50.                 clients.addElement( new Client(newClient, this) );
  51.             }
  52.         }
  53.         catch(Exception ex) {
  54.             // если ошибка любая, то перед выходом закроем серверный сокет...
  55.             if(serverSocket != null) serverSocket.close();
  56.             // покажем, что не удалось :(
  57.             out("Error in start server :(");
  58.         }
  59.     }
  60.    
  61.     // функция рассылки сообщения всем...
  62.     public void sendMessage(double Danni, long uid) throws Exception {
  63.         // json с сообщением...
  64.         JSONObject messageJSON = new JSONObject();
  65.         JSONArray ar = new JSONArray();
  66.         ar.add(Danni);
  67.         messageJSON.put("DanniIgri", ar);
  68.        
  69.         // массив байт готового сообщения для рассылки...
  70.         byte[] finalMessage = getMessageBytes(messageJSON);
  71.        
  72.         // разошлем сообщение...
  73.         for(int i = 0; i < clients.size(); i++) {
  74.             // берем из вектора клиент...
  75.             Client client = (Client)clients.get(i);
  76.            
  77.             // если он не подключен - удалим...
  78.             if(!client.isConnected()) {
  79.                 deleteClient(client);
  80.                 continue;
  81.             }
  82.            
  83.             // если тут - все ок... отошлем...
  84.             client.send(finalMessage, uid);
  85.         }
  86.     }
  87.    
  88.     // функция удаления из массива клиента...
  89.     public void deleteClient(Client client) {
  90.         // удалим...
  91.         deleteReal(client);
  92.         // скажем что отсоединился...
  93.         out("Client disconnected... Online: " + clients.size());
  94.     }
  95.    
  96.     // функция удаления с сообщением...
  97.     public void deleteClient(Client client, double Danni) {
  98.         // удалим...
  99.         deleteReal(client);
  100.         // покажем сообщение...
  101.         out("Client disconnected... Online: " + clients.size() + Danni);
  102.     }
  103.    
  104.     // именно тут идет удаление...
  105.     private void deleteReal(Client client) {
  106.         // удалим из вектора...
  107.         clients.remove(client);
  108.         // и деактивируем...
  109.         client.deactivate();
  110.     }
  111.    
  112.     // просто функция-оболочка для упрощения...
  113.     public void out(String s) {
  114.         System.out.println(s);
  115.     }
  116.    
  117.     // функция получения байт сообщения...
  118.     public byte[] getMessageBytes(JSONObject json) throws Exception {
  119.         // определили массив байт для сохранения самого сообщения...
  120.         // заносим сюда байты сообщения в кодировке utf-8
  121.         byte[] messageBytes = (json.toJSONString()).getBytes("UTF8");
  122.        
  123.         // массив байт указывающий длину сообщения...
  124.         // allocate(4) - взять 4 байта, поскольку int = 4 байта...
  125.         // putInt(XXX) - добавить число - int
  126.         // array() - получить массив байт в ответе...
  127.         byte[] messageLength = ByteBuffer.allocate(4).putInt(messageBytes.length).array();
  128.        
  129.         // собираем наконец, готовый массив...
  130.         // массив байт готового сообщения...
  131.         byte[] finalMessage = new byte[messageBytes.length + 4];
  132.         System.arraycopy(messageLength, 0, finalMessage, 0, 4);
  133.         System.arraycopy(messageBytes, 0, finalMessage, 4, messageBytes.length);
  134.        
  135.         return finalMessage;
  136.     }
  137.    
  138.     // функция удаления всех потоков с этим клиентом, кроме текущего(переданного)...
  139.    
  140.    
  141.    
  142.     // начало программы....
  143.     public static void main(String[] args) throws Exception {
  144.         Server s = new Server();
  145.     }
  146. }
Апчхи

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

Re: Передача массива через бинарный сокет

Сообщение sasha^ » 22 июн 2014, 11:57

Не могу я настроить передачу массивов :(
Порылся в документации, как оказалось put не может передавать массивы(

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

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

Re: Передача массива через бинарный сокет

Сообщение dog » 22 июн 2014, 17:19

Честно сказать не знал что put не умеет передавать массивы, json не умеет передавать массивы? У меня сокет сервер передаёт даже классы, я молчу про json, он в картах у меня используется... Судя по описанию, у вас авторизация не проходит через вк, так может сервер ничего и не отправляет, раз ошибка авторизации, поэтому и нет никакого ответа от сервера во флешку? Ну или можно посмотреть какие данные хоть приходят с сервера, ну и что флешка отправляет, есть программка wpe pro, вам уже дали ссылку выше, вот там json строку можно легко увидеть, если русских букв конечно нету, иначе точки будут. Вы посмотрите в коде, я думаю что урок правильный, значит всё должно работать, где то у вас ошибка в коде, может у вас на сервере нет crossdomain.xml?
dog

 
Сообщения: 43
Зарегистрирован: 17 мар 2014, 15:18
Благодарил (а): 0 раз.
Поблагодарили: 9 раз.

Re: Передача массива через бинарный сокет

Сообщение dog » 22 июн 2014, 17:37

Попробуйте проверить, есть ли вообще подключение к сокету из флешки, в коде где идёт подключение к сокету, слушатели событий, поставьте там везде trace, если Event.CONNECT напишите там trace("connect ok"); Event.CLOSE, там напишите trace("connect close"); а в остальных напишите trace("connect error");

Так можно увидеть соединяется ли флешка с сокетом или нет, или может у вас вообще нельзя к сокету подключаться, если вы используете Flash CS - параметры публикации, там по умолчанию Доступ только к локальным файлам, а надо выбрать Доступ только к сети
dog

 
Сообщения: 43
Зарегистрирован: 17 мар 2014, 15:18
Благодарил (а): 0 раз.
Поблагодарили: 9 раз.

Re: Передача массива через бинарный сокет

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

т.е. вот так должен передаваться и я всего лишь неправильно декодирую
  1. public void sendMessage(String Danni, long uid) throws Exception
?
Апчхи

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


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



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

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

cron