Название: Qt сервер vs Action Script 3 клиент на Socket-ах. Проблема с передачей сообщений Отправлено: Dzeto от Ноября 27, 2013, 22:31 Доброго времени суток.
Соединяю Action Script 3 клиент с сервером, написанном на Qt через socket'ы. Соединение отлично устанавливается, но есть проблемы с передачей сообщения. Сервер принимает его, но не может "распознать" что пришло. Код в AS3: Когда устанавливаем соединение, пробуем сразу отослать данные на сервер. Код: private function connectHandler(event:Event):void Код приема сообщения на сервере Qt: Код: void server::slotReadClient() Скрин того, что пришло на сервер (а должно быть "11"): (http://imglink.ru/pictures/27-11-13/119677ef6734f9046825535c3e21bd6f.jpg) (http://imglink.ru) P.S. Клиент, написанный на Qt успешно принимает и отправляет сообщения на сервер. Название: Re: Qt сервер vs Action Script 3 клиент на Socket-ах. Проблема с передачей сообщений Отправлено: Dzeto от Ноября 28, 2013, 16:37 На сервер поступают байты в UTF-8 кодировке, как я понял. И надо их правильно считать из сокета. Как это можно сделать, если я прав?
Название: Re: Qt сервер vs Action Script 3 клиент на Socket-ах. Проблема с передачей сообщений Отправлено: Dzeto от Ноября 28, 2013, 21:54 Up
Название: Re: Qt сервер vs Action Script 3 клиент на Socket-ах. Проблема с передачей сообщений Отправлено: kibsoft от Ноября 28, 2013, 23:02 Цитировать QString msg_type, freq; Как я понял, с сервера приходят строка и short int. Почему ты пытаешься 2 строки прочитать?in » msg_type » freq; 2) Судя по тому, что пришло 4 байта, значит строка у тебя не null terminated, а QDataStream читает массив чаров с \0 на конце через operator>> 3) QDataStream с QString через operator>> не работает, насколько я знаю. Вывод: придумай свой протокол и читай данные через readRawData(). Или вообще не страдай фигней с придумыванием своего протокола, а просто юзай JSON RPC. Название: Re: Qt сервер vs Action Script 3 клиент на Socket-ах. Проблема с передачей сообщений Отправлено: Dzeto от Ноября 28, 2013, 23:39 Цитировать QString msg_type, freq; Как я понял, с сервера приходят строка и short int. Почему ты пытаешься 2 строки прочитать?in » msg_type » freq; 2) Судя по тому, что пришло 4 байта, значит строка у тебя не null terminated, а QDataStream читает массив чаров с \0 на конце через operator>> 3) QDataStream с QString через operator>> не работает, насколько я знаю. Вывод: придумай свой протокол и читай данные через readRawData(). Или вообще не страдай фигней с придумыванием своего протокола, а просто юзай JSON RPC. Если я с Qt клиента(не путать с AS3 клиентом, который мне нужен) отправляю данные так: Код: void MyClient::slotSendToServer() При этом на сервере могу прописать даже: Код: QString str1, str2, str3, str4 Если с AS3 клиента(!) отправить строку "12", а на сервере считывать так: Код: quint8 command, command1; По пункту 2 - можете пояснить что да как? Ваша мысль кажется очень здравой. В каком виде нужно передавать или читать строку, чтобы можно было ее вывести на экран? Хотелось бы сколько-нибудь рабочий пример (и меньше ссылок:)) P.S. Про JSON RPS заинтересовало и даже очень, но давай сперва попробуем сделать без него. Название: Re: Qt сервер vs Action Script 3 клиент на Socket-ах. Проблема с передачей сообщений Отправлено: kibsoft от Ноября 29, 2013, 01:13 Код: out<<quint16(0)<<msg_type<<ui.Edit_freq->text(); Таким образом, на сервере QDataStream первую строку читает до \0 и следующую также. Цитировать сли с AS3 клиента(!) отправить строку "12", а на сервере считывать так: Пишете строку, а читаете quin32..Они по-разному кодируются.Если у вас передаются исключительно строки, то вместо QDataStream можно использовать QTextStream на сервере. Туда можно задать текстовый кодек: Код: stream.setCodec(QTextCodec::codecForName("UTF-8")) Через QDataStream не получится сразу в UTF-8 читать. Название: Re: Qt сервер vs Action Script 3 клиент на Socket-ах. Проблема с передачей сообщений Отправлено: Dzeto от Ноября 29, 2013, 01:39 Код: out<<quint16(0)<<msg_type<<ui.Edit_freq->text(); Таким образом, на сервере QDataStream первую строку читает до \0 и следующую также. Цитировать сли с AS3 клиента(!) отправить строку "12", а на сервере считывать так: Пишете строку, а читаете quin32..Они по-разному кодируются.Если у вас передаются исключительно строки, то вместо QDataStream можно использовать QTextStream на сервере. Туда можно задать текстовый кодек: Код: stream.setCodec(QTextCodec::codecForName("UTF-8")) Через QDataStream не получится сразу в UTF-8 читать. Большое спасибо! Получилось сделать с помощью QTextStream и stream.setCodec(QTextCodec::codecForName("UTF-8")). Данные не только строковые, но для начала подойдет. |