Russian Qt Forum

Qt => Работа с сетью => Тема начата: t.key от Март 25, 2010, 01:49



Название: QTextStream и ее использоование с QTcpSocket
Отправлено: 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;
}


Укажите ошибку плиз.


Название: Re: QTextStream и ее использоование с QTcpSocket
Отправлено: pastor от Март 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 в ассистанте.


Название: Re: QTextStream и ее использоование с QTcpSocket
Отправлено: t.key от Март 25, 2010, 07:51
Внес ваши изменения, сервер застревает на !socket.waitForReadyRead(). Это очень сильно упрощенный код, часть GUI программы, заняти гланого потока не проблема. Я подумал, кокда заработает здесь, применю это там(SIGNAL, SLOT).
Меня интересует как связать QTextStream и QTcpSocket. В книге и QAssistant'е ниче толкового не нашел.


Название: Re: QTextStream и ее использоование с QTcpSocket
Отправлено: pastor от Март 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;
}

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


Название: Re: QTextStream и ее использоование с QTcpSocket
Отправлено: t.key от Март 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.).
Значит текст все же дошел.
Кажись он както не так считывает.