Передача массива через бинарный сокет
Передача массива через бинарный сокет
В продолжение темы http://flapps.ru/forum/topic7612.html:
Хочу совершить передачу массива числовых данных через бинарный сокет. Упаковка происходит вот так: Для полноты картины и проверки всё ли правильно. Есть проблема с обработкой данных в сокет-сервере. Он принимает данные типа String, но должен принимать double. Пробовал позаменять строки на теоретические нужные, результата не добился Ну и как результат, запись в массив данных, из которого они и используются: В отказе передачи данных подозреваю сокет-сервер
Хочу совершить передачу массива числовых данных через бинарный сокет. Упаковка происходит вот так: Для полноты картины и проверки всё ли правильно. Есть проблема с обработкой данных в сокет-сервере. Он принимает данные типа String, но должен принимать double. Пробовал позаменять строки на теоретические нужные, результата не добился Ну и как результат, запись в массив данных, из которого они и используются: В отказе передачи данных подозреваю сокет-сервер
Re: Передача массива через бинарный сокет
не дай боже тебе следователем работать.. обвинил блин невиновногоВ отказе передачи данных подозреваю сокет-сервер
Код: Выделить всё
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(); }
Re: Передача массива через бинарный сокет
Точно! Я же JSON.stringify забыл!) Нужно исправить)
P.S. Про стиль: больше не буду
P.S. Про стиль: больше не буду
Re: Передача массива через бинарный сокет
Да, и случаем, нет ли какой-то программы, для отслеживания данных подобного типа, что-то похожее на Charles?
Re: Передача массива через бинарный сокет
wpe pro... ток там текст отслеживает хорошо... бинарные данные,amf и пр. точками показывает.. как и русские символы (кажись)...Да, и случаем, нет ли какой-то программы, для отслеживания данных подобного типа, что-то похожее на Charles?
+ отключай антивирус, а то он удаляет файлы программы... ведь чтобы сокеты слушать нужно внедрится в процесс...
http://dropmefiles.com/Z3XGr вот временная ссылка.. хранится не долго.. поспеши)))
Re: Передача массива через бинарный сокет
Не могу я настроить передачу массивов
Порылся в документации, как оказалось put не может передавать массивы(
В общем, подправил файл сервера, согласно документации, но при запуске в ВК ни сообщения про соединение, ни авторизации нет; хотя при компиляции про соединение сообщается и про провал авторизации, что вполне обычно. Прошу направить на путь истины:
Порылся в документации, как оказалось 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(); }}
Re: Передача массива через бинарный сокет
неужели? в java же, вроде, полная поддержка json, а значит в объекте массив легко может быть... а потому это у тебя где-то ошибка..))) подумай, порыйся и поймешь...Не могу я настроить передачу массивов
Порылся в документации, как оказалось put не может передавать массивы(
Re: Передача массива через бинарный сокет
Честно сказать не знал что put не умеет передавать массивы, json не умеет передавать массивы? У меня сокет сервер передаёт даже классы, я молчу про json, он в картах у меня используется... Судя по описанию, у вас авторизация не проходит через вк, так может сервер ничего и не отправляет, раз ошибка авторизации, поэтому и нет никакого ответа от сервера во флешку? Ну или можно посмотреть какие данные хоть приходят с сервера, ну и что флешка отправляет, есть программка wpe pro, вам уже дали ссылку выше, вот там json строку можно легко увидеть, если русских букв конечно нету, иначе точки будут. Вы посмотрите в коде, я думаю что урок правильный, значит всё должно работать, где то у вас ошибка в коде, может у вас на сервере нет crossdomain.xml?
Re: Передача массива через бинарный сокет
Попробуйте проверить, есть ли вообще подключение к сокету из флешки, в коде где идёт подключение к сокету, слушатели событий, поставьте там везде trace, если Event.CONNECT напишите там trace("connect ok"); Event.CLOSE, там напишите trace("connect close"); а в остальных напишите trace("connect error");
Так можно увидеть соединяется ли флешка с сокетом или нет, или может у вас вообще нельзя к сокету подключаться, если вы используете Flash CS - параметры публикации, там по умолчанию Доступ только к локальным файлам, а надо выбрать Доступ только к сети
Так можно увидеть соединяется ли флешка с сокетом или нет, или может у вас вообще нельзя к сокету подключаться, если вы используете Flash CS - параметры публикации, там по умолчанию Доступ только к локальным файлам, а надо выбрать Доступ только к сети
Re: Передача массива через бинарный сокет
т.е. вот так должен передаваться и я всего лишь неправильно декодирую ?
Код: Выделить всё
public void sendMessage(String Danni, long uid) throws Exception