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

Программирование, которое не связано с API.
Ответить
Апчхи
Сообщения: 79
Зарегистрирован: 26 авг 2013, 23:12

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

Сообщение Апчхи »

В продолжение темы http://flapps.ru/forum/topic7612.html:
Хочу совершить передачу массива числовых данных через бинарный сокет. Упаковка происходит вот так:
 Упаковка

Код: Выделить всё

function send(e:Event):void {            // массив байт для посылки...            var sendBytes:ByteArray = new ByteArray();                        // байты самого сообщения...            var mBytes:ByteArray = new ByteArray();            // запишем сюда массив...            for (var i:int = 0; i < Danni.length; i++) {                 mBytes.writeUTFBytes(Danni[i++]);                 mBytes.writeFloat(Danni[i]);                    trace("bytes.position is: " + mBytes.position);                 }                         // запишем блину сообщения...            sendBytes.writeInt(mBytes.length);            // запишем сам массив байт сообщения...            sendBytes.writeBytes(mBytes);                        // отошлем байты...            _socket.writeBytes(sendBytes);            _socket.flush();        }
Для полноты картины и проверки всё ли правильно. Есть проблема с обработкой данных в сокет-сервере. Он принимает данные типа String, но должен принимать double. Пробовал позаменять строки на теоретические нужные, результата не добился
 Начальные строки

Код: Выделить всё

 linkForServer.sendMessage((String)decoded_message.get("danniSoket"), uid);....public void sendMessage(String danniSoket, long uid) throws Exception {        // json с сообщением...        JSONObject messageJSON = new JSONObject();        messageJSON.put("uid", uid);        messageJSON.put("danniSoket", danniSoket);....
 Конечные строки

Код: Выделить всё

 linkForServer.sendMessage((double)decoded_message.get("Danni"), uid);....public void sendMessage(double Danni, long uid) throws Exception {        // json с сообщением...        JSONObject messageJSON = new JSONObject();        messageJSON.put("uid", uid);        messageJSON.put("Danni", Danni);....
Ну и как результат, запись в массив данных, из которого они и используются:
 Запись

Код: Выделить всё

...public var DanniM:Array....var decodedMessage:Object = JSON.parse(user_message);for (var i:int = 0; i < decodedMessage.length; i++) {   DanniM[i] = decodedMessage.Danni[i];            } 
В отказе передачи данных подозреваю сокет-сервер :lol:
sasha^
Сообщения: 711
Зарегистрирован: 10 сен 2012, 16:52

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

Сообщение sasha^ »

В отказе передачи данных подозреваю сокет-сервер :lol:
не дай боже тебе следователем работать.. обвинил блин невиновного :)

Код: Выделить всё

function send(e:Event):void {            // массив байт для посылки...            var sendBytes:ByteArray = new ByteArray();                       // байты самого сообщения...            var mBytes:ByteArray = new ByteArray();            // запишем сюда массив...            for (var i:int = 0; i < Danni.length; i++) {                mBytes.writeUTFBytes(Danni[i++]);                mBytes.writeFloat(Danni[i]);                    trace("bytes.position is: " + mBytes.position);                }            // что за хрень? как ты массив записываешь?)))) ты читаешь json, а пишешь флоат?))) ппц...            mBytes.writeUTFBytes(JSON.stringify(Danni));            // все!!! массив json есть))))            // и да.. что за идиотский стиль давать названия переменных транслитом?) меня это бесит!!! как и многих кто отвечает на форуме..            // в следующий раз не отвечу=))                       // запишем блину сообщения...            sendBytes.writeInt(mBytes.length);            // запишем сам массив байт сообщения...            sendBytes.writeBytes(mBytes);                       // отошлем байты...            _socket.writeBytes(sendBytes);            _socket.flush();        }
Апчхи
Сообщения: 79
Зарегистрирован: 26 авг 2013, 23:12

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

Сообщение Апчхи »

Точно! Я же JSON.stringify забыл!) Нужно исправить) :D
P.S. Про стиль: больше не буду
Изображение
Апчхи
Сообщения: 79
Зарегистрирован: 26 авг 2013, 23:12

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

Сообщение Апчхи »

Да, и случаем, нет ли какой-то программы, для отслеживания данных подобного типа, что-то похожее на Charles?
sasha^
Сообщения: 711
Зарегистрирован: 10 сен 2012, 16:52

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

Сообщение sasha^ »

Да, и случаем, нет ли какой-то программы, для отслеживания данных подобного типа, что-то похожее на Charles?
wpe pro... ток там текст отслеживает хорошо... бинарные данные,amf и пр. точками показывает.. как и русские символы (кажись)...
+ отключай антивирус, а то он удаляет файлы программы... ведь чтобы сокеты слушать нужно внедрится в процесс... :)
http://dropmefiles.com/Z3XGr вот временная ссылка.. хранится не долго.. поспеши)))
Апчхи
Сообщения: 79
Зарегистрирован: 26 авг 2013, 23:12

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

Сообщение Апчхи »

Не могу я настроить передачу массивов :(
Порылся в документации, как оказалось put не может передавать массивы(
В общем, подправил файл сервера, согласно документации, но при запуске в ВК ни сообщения про соединение, ни авторизации нет; хотя при компиляции про соединение сообщается и про провал авторизации, что вполне обычно. Прошу направить на путь истины:

Код: Выделить всё

// импортируем классы для работы с потокамиimport java.io.*;// импортируем классы для работы с сокетамиimport java.net.*;// импортируем классы для работы с буферами, потоками, получением байтов от значений и т.д.// т.е. new io - новый input output... именно тут класс ByteBufferimport java.nio.*;// импортируем Vector - массив автоматической длины...import java.util.Vector;// классы для работы JSONimport org.json.simple.*;import org.json.simple.parser.*; public class Server {    // порт для работы сервера...    public static final int PORT = 17030;        // айди приложения...    public static final long APP_ID = 4039028;        // ключ приложения...    public static final String APP_SECRET = "afgymaF4fWilS4RTpvKg";        // сокет для принятия соединений...    private ServerSocket serverSocket;        // массив клиентов...    private Vector<Client> clients;        // конструктор...    public Server() throws Exception {        try {            // созданим вектор - массив автоматической длинны для клиентов...            clients = new Vector<Client>();                        // создадим серверный сокет...            serverSocket = new ServerSocket(Server.PORT);                        // напишем что сервер запускается            out("Server start...");                        // ждем подключений бесконечно...            while(true) {                // ждем подключений... поток блокируется...                Socket newClient = serverSocket.accept();                                // мы получили подключение... теперь создадим класс Client                // и запишем его в массив клиентов..                out("New client connected... Online: " + (clients.size()+1) );                clients.addElement( new Client(newClient, this) );            }        }        catch(Exception ex) {            // если ошибка любая, то перед выходом закроем серверный сокет...            if(serverSocket != null) serverSocket.close();            // покажем, что не удалось :(            out("Error in start server :(");        }    }        // функция рассылки сообщения всем...    public void sendMessage(double Danni, long uid) throws Exception {        // json с сообщением...        JSONObject messageJSON = new JSONObject();        JSONArray ar = new JSONArray();        ar.add(Danni);        messageJSON.put("DanniIgri", ar);                // массив байт готового сообщения для рассылки...        byte[] finalMessage = getMessageBytes(messageJSON);                // разошлем сообщение...        for(int i = 0; i < clients.size(); i++) {            // берем из вектора клиент...            Client client = (Client)clients.get(i);                        // если он не подключен - удалим...            if(!client.isConnected()) {                deleteClient(client);                continue;            }                        // если тут - все ок... отошлем...            client.send(finalMessage, uid);        }    }        // функция удаления из массива клиента...    public void deleteClient(Client client) {        // удалим...        deleteReal(client);        // скажем что отсоединился...        out("Client disconnected... Online: " + clients.size());    }        // функция удаления с сообщением...    public void deleteClient(Client client, double Danni) {        // удалим...        deleteReal(client);        // покажем сообщение...        out("Client disconnected... Online: " + clients.size() + Danni);    }        // именно тут идет удаление...    private void deleteReal(Client client) {        // удалим из вектора...        clients.remove(client);        // и деактивируем...        client.deactivate();    }        // просто функция-оболочка для упрощения...    public void out(String s) {        System.out.println(s);    }        // функция получения байт сообщения...    public byte[] getMessageBytes(JSONObject json) throws Exception {        // определили массив байт для сохранения самого сообщения...        // заносим сюда байты сообщения в кодировке utf-8        byte[] messageBytes = (json.toJSONString()).getBytes("UTF8");                // массив байт указывающий длину сообщения...        // allocate(4) - взять 4 байта, поскольку int = 4 байта...        // putInt(XXX) - добавить число - int        // array() - получить массив байт в ответе...        byte[] messageLength = ByteBuffer.allocate(4).putInt(messageBytes.length).array();                // собираем наконец, готовый массив...        // массив байт готового сообщения...        byte[] finalMessage = new byte[messageBytes.length + 4];        System.arraycopy(messageLength, 0, finalMessage, 0, 4);        System.arraycopy(messageBytes, 0, finalMessage, 4, messageBytes.length);                return finalMessage;    }        // функция удаления всех потоков с этим клиентом, кроме текущего(переданного)...                // начало программы....    public static void main(String[] args) throws Exception {        Server s = new Server();    }}
sasha^
Сообщения: 711
Зарегистрирован: 10 сен 2012, 16:52

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

Сообщение sasha^ »

Не могу я настроить передачу массивов :(
Порылся в документации, как оказалось put не может передавать массивы(
неужели? в java же, вроде, полная поддержка json, а значит в объекте массив легко может быть... а потому это у тебя где-то ошибка..))) подумай, порыйся и поймешь...
dog
Сообщения: 43
Зарегистрирован: 17 мар 2014, 15:18

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

Сообщение dog »

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

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

Сообщение dog »

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

Так можно увидеть соединяется ли флешка с сокетом или нет, или может у вас вообще нельзя к сокету подключаться, если вы используете Flash CS - параметры публикации, там по умолчанию Доступ только к локальным файлам, а надо выбрать Доступ только к сети
Апчхи
Сообщения: 79
Зарегистрирован: 26 авг 2013, 23:12

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

Сообщение Апчхи »

т.е. вот так должен передаваться и я всего лишь неправильно декодирую

Код: Выделить всё

public void sendMessage(String Danni, long uid) throws Exception
?
Ответить