Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > Серверные технологии и Flash

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 17.04.2013, 00:46
Casperovskii вне форума Посмотреть профиль Отправить личное сообщение для Casperovskii Найти все сообщения от Casperovskii
  № 11  
Ответить с цитированием
Casperovskii

Регистрация: Mar 2013
Сообщений: 5
Всем привет! У меня очередная проблема, боролся месяц, сам не смог победить. Хабр, друзья и другой форум не помогли . Итак, у меня есть во Flash:
Код AS3:
public function dataWrite(e:Event):void {
			clientSocket.writeUTFBytes(fieldToWrite.text);//сокет, подключенный к серву на QT
			clientSocket.flush();
			trace(clientSocket.bytesAvailable, clientSocket.connected);
			fieldToWrite.text = "";//текстовое поле, из которого берем строку для передачи
			fieldToWrite.setFocus();
		}
И код функции на сервере, которая должна срабатывать каждый раз, когда любой из клиентов посылает строчку:
Код:
void multiServer::sendDataToForm(int socDesc, QString txt)
{
    qDebug()<<listOfThreads.size(); //листстредов - всех клиентов, выводим его размер
    qDebug()<<txt;//считанный с любого из клиентов текст
    QString txt2 = QString::number(socDesc) + ";" + txt;
    emit sendingData(MainWindow::DATAINCOME,txt2);//отправляем считанный текст в гуи
    for (int i = 0;i<listOfThreads.size();i++) //цикл отправки всем клиентам сообщения
    {
        QByteArray myByteArray;
//отправляем
        listOfThreads[i]->socket->write(myByteArray.append(QString("Client written;") + QString::number(socDesc) + ";" + txt));
        qDebug()<<myByteArray;
    }
}
Проблема в следующем: если отсутствует цикл, то сервер считывает все сообщения прекрасно, но, естественно, ничего не отсылает назад. Если цикл есть, то сервер считывает первое сообщение, отсылает его всем клиентам и больше не может считать ни одного сообщения, кроме вновь подключившегося клиента. Добавление в цикл для сокета функций waitforreadyread() и flush() не помогло. Прошу вашей помощи. Спасибо за внимание.

P.S. Если нужен другой код (объявление треда или код самого треда и так далее, готов предоставить. Но проблема именно в цикле/отправке данных обратно на клиент).

Старый 22.04.2013, 13:03
iSeeYou вне форума Посмотреть профиль Отправить личное сообщение для iSeeYou Найти все сообщения от iSeeYou
  № 12  
Ответить с цитированием
iSeeYou

Регистрация: Oct 2008
Сообщений: 14
Нужен совет тоже в тему С++ и файл политик

Есть клиент который лежит на 80 порту
Есть сервер который лежит на 7777 порту (который не может отдавать файл политик)
Есть программка на 1111 порту, которая выполняет функцию моста между сервером-клиентом. В которой банально:
Код AS3:
if (str=="<policy-file-request/>")
return "<cross-domain-policy>...</cross-domain-policy>";
else
//ломится на сервер с портом 7777 и возвращает результат
Вопрос: пройдет ли такая штука?

Если да, интересуют сроки и стоимость такой программы на С++...

Старый 22.04.2013, 13:09
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 13  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
нет. Файл политик флеш плеер по умолчанию будет запрашивать с 843 порта. И сервер должен отдавать его именно с этого порта.

Старый 22.04.2013, 13:19
iSeeYou вне форума Посмотреть профиль Отправить личное сообщение для iSeeYou Найти все сообщения от iSeeYou
  № 14  
Ответить с цитированием
iSeeYou

Регистрация: Oct 2008
Сообщений: 14
то есть хотите сказать при связке
клиент > программа на 1111 порта > сервер на 7777 порту

клиент запросит файловую политику с 7777?

Старый 22.04.2013, 16:05
C4Grey вне форума Посмотреть профиль Отправить личное сообщение для C4Grey Найти все сообщения от C4Grey
  № 15  
Ответить с цитированием
C4Grey

Регистрация: May 2007
Сообщений: 181
Отправить сообщение для C4Grey с помощью ICQ Отправить сообщение для C4Grey с помощью Skype™
Цитата:
Сообщение от iSeeYou Посмотреть сообщение
то есть хотите сказать при связке
клиент > программа на 1111 порта > сервер на 7777 порту

клиент запросит файловую политику с 7777?
Можно явно указать, откуда запрашивать policy:

Код AS3:
public function get PolicyServer():String
{
	return "xmlsocket://" + Host + ":" + PolicyPort;
}
...
Security.loadPolicyFile(PolicyServer);

Старый 22.04.2013, 21:32
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 16  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
то есть хотите сказать при связке
клиент > программа на 1111 порта > сервер на 7777 порту

клиент запросит файловую политику с 7777?
Похоже я вообще не понял Вашего вопроса

Старый 23.04.2013, 13:08
iSeeYou вне форума Посмотреть профиль Отправить личное сообщение для iSeeYou Найти все сообщения от iSeeYou
  № 17  
Ответить с цитированием
iSeeYou

Регистрация: Oct 2008
Сообщений: 14
Цитата:
Сообщение от C4Grey Посмотреть сообщение
Можно явно указать, откуда запрашивать policy:

Код AS3:
public function get PolicyServer():String
{
	return "xmlsocket://" + Host + ":" + PolicyPort;
}
...
Security.loadPolicyFile(PolicyServer);
То есть я могу работать с сервером, который запущен на 7777, а файловую политику для него брать с 1111?

Я так и делаю, вручную получаю политику, через Security.loadPolicyFile, но полагал что ip: port необходимо прописывать именного того сервака, к которому впоследствии обращаюсь

Старый 23.04.2013, 13:55
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 18  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
В общем, да. Получается такая схема. Флеш плеер стучится на указанный порт для получения файла политик. Получает этот файл и закрывает соединение. Все. Он убедился что ресурс разрешает ему доступ и теперь может коннектиться на любой другой порт. Так и должно быть, это нормально.
Цитата:
но полагал что ip: port необходимо
ip - да
порт - нет

Старый 23.04.2013, 16:25
iSeeYou вне форума Посмотреть профиль Отправить личное сообщение для iSeeYou Найти все сообщения от iSeeYou
  № 19  
Ответить с цитированием
iSeeYou

Регистрация: Oct 2008
Сообщений: 14
Цитата:
Сообщение от caseyryan Посмотреть сообщение
ip - да
порт - нет
Спасибо это как раз то что мне нужно.

Старый 23.04.2013, 18:48
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 20  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
Сообщение от Casperovskii Посмотреть сообщение
Всем привет! У меня очередная проблема, боролся месяц, сам не смог победить. Хабр, друзья и другой форум не помогли . Итак, у меня есть во Flash:
Код AS3:
public function dataWrite(e:Event):void {
			clientSocket.writeUTFBytes(fieldToWrite.text);//сокет, подключенный к серву на QT
			clientSocket.flush();
			trace(clientSocket.bytesAvailable, clientSocket.connected);
			fieldToWrite.text = "";//текстовое поле, из которого берем строку для передачи
			fieldToWrite.setFocus();
		}
И код функции на сервере, которая должна срабатывать каждый раз, когда любой из клиентов посылает строчку:
Код:
void multiServer::sendDataToForm(int socDesc, QString txt)
{
    qDebug()<<listOfThreads.size(); //листстредов - всех клиентов, выводим его размер
    qDebug()<<txt;//считанный с любого из клиентов текст
    QString txt2 = QString::number(socDesc) + ";" + txt;
    emit sendingData(MainWindow::DATAINCOME,txt2);//отправляем считанный текст в гуи
    for (int i = 0;i<listOfThreads.size();i++) //цикл отправки всем клиентам сообщения
    {
        QByteArray myByteArray;
//отправляем
        listOfThreads[i]->socket->write(myByteArray.append(QString("Client written;") + QString::number(socDesc) + ";" + txt));
        qDebug()<<myByteArray;
    }
}
Проблема в следующем: если отсутствует цикл, то сервер считывает все сообщения прекрасно, но, естественно, ничего не отсылает назад. Если цикл есть, то сервер считывает первое сообщение, отсылает его всем клиентам и больше не может считать ни одного сообщения, кроме вновь подключившегося клиента. Добавление в цикл для сокета функций waitforreadyread() и flush() не помогло. Прошу вашей помощи. Спасибо за внимание.

P.S. Если нужен другой код (объявление треда или код самого треда и так далее, готов предоставить. Но проблема именно в цикле/отправке данных обратно на клиент).
А почему QByteArray myByteArray; объявлен, но не инициализирован? По логике здесь должнно быть какое-то искелючение типа NullPointerException или какой там аналог в С++.
В джаве такая конструкция бы сразу упала, без вариантов. Даже примитив так нельзя объявить в джаве без инициализации внутнри тела метода. На уровне класса можно, он примет значение по умолчанию, но внутри метода никакого умолчания не будет. Вылетит исключение. В общем, это лишь предположение, но советую проверить

Создать новую тему Ответ Часовой пояс GMT +4, время: 04:20.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 04:20.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.