Russian Qt Forum
Ноябрь 23, 2024, 14:50 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTextStream и ее использоование с QTcpSocket  (Прочитано 5533 раз)
t.key
Гость
« : Март 25, 2010, 01:49 »

Проблема передаче текста в QTextStream. Даже не понятно прибыл ли мой текст. Получаю ее пустым.
Код:

#include <iostream>
#include <QTcpServer>
#include <QTcpSocket>
#include <QTextStream>
#include <QHostAddress>

using namespace std;

int client(){
QTcpSocket socket;
socket.connectToHost(QHostAddress::LocalHost, 6112);
if (socket.state() != QAbstractSocket::ConnectingState){
cerr << "!:client not connecting ...\n";
return 1;
}

if (!socket.waitForConnected()){
cerr << "!:client not connected ...\n";
return 1;
}
else
cout << "::client connection succeed ..\n";

QTextStream stream(&socket);
stream.setCodec("UTF-8");

stream << "hello";

return 0;
}

int server(){
QTcpServer server;
if (!server.listen(QHostAddress::Any, 6112)){
cerr << "!:server not listening ...\n";
return 1;
}

QTcpSocket socket;
while (!server.waitForNewConnection(1000));
if (!socket.setSocketDescriptor(server.socketDescriptor())){
cerr << "!:server not connected ...\n";
return 1;
}
else
cout << "::server socket state " << socket.state() << " ...\n";

QTextStream stream(&socket);
stream.setCodec("UTF-8");

QString str;
str = stream.readLine();
/*
Пытался использовать
stream >> str;
тот же эффект.
*/

cout << "::" << str.toStdString() << endl;

return 0;
}

int main(){
int a;
cin >> a;
if (a == 0)
return server();
else if (a == 1)
return client();
else
return 0;
}


Укажите ошибку плиз.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #1 : Март 25, 2010, 02:28 »

Добавь QCoreApplication app(argc, argv);


Код
C++ (Qt)
int main(int argc, char **argv){
       QCoreApplication app(argc, argv);
 
int a;
cin >> a;
if (a == 0)
return server();
else if (a == 1)
return client();
else
return 0;
}

И добавь waitForReadyRead()

Код
C++ (Qt)
int server(){
   .....
   else
cout << "::server socket state " << socket.state() << " ...\n";
 
   if (!socket.waitForReadyRead())
      return 1;
 
   QTextStream stream(&socket);
  ....
}


Но лучше перейти на асинхронный режим работы (signal/slot), чтоюы не блокировать главный поток. Ознакомся с документацией  по QAbstractSocket в ассистанте.
« Последнее редактирование: Март 25, 2010, 02:34 от pastor » Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
t.key
Гость
« Ответ #2 : Март 25, 2010, 07:51 »

Внес ваши изменения, сервер застревает на !socket.waitForReadyRead(). Это очень сильно упрощенный код, часть GUI программы, заняти гланого потока не проблема. Я подумал, кокда заработает здесь, применю это там(SIGNAL, SLOT).
Меня интересует как связать QTextStream и QTcpSocket. В книге и QAssistant'е ниче толкового не нашел.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #3 : Март 25, 2010, 11:53 »

Внес ваши изменения, сервер застревает на !socket.waitForReadyRead().

Значит данные клиент не получил.


Еще изменения:
Код
C++ (Qt)
int client(){
       ....
 
       QTextStream stream(&socket);
stream.setCodec("UTF-8");
 
stream << "hello";
 
       stream.flush();
 
       socket.disconnectFromHost();
       socket.waitForDisconnected();
 
return 0;
}

Запускаем сначала сервер, потом клиент под отладчиком. Смотрим, думаем )
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
t.key
Гость
« Ответ #4 : Март 26, 2010, 03:16 »

Мое новое добавление:
Код:

cout << "::stream status " << stream.status() << endl;

Для клиента 0 (QTextStream::Ok   0   The text stream is operating normally.),
для сервера 1 (QTextStream::ReadPastEnd   1   The text stream has read past the end of the data in the underlying device.).
Значит текст все же дошел.
Кажись он както не так считывает.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.104 секунд. Запросов: 22.