Saturday, July 5th 2008, 12:55pm UTC+1

You are not logged in.

  • Login
  • Register

Dear visitor, welcome to QtForum.org. If this is your first visit here, please read the Help. It explains how this page works. You must be registered before you can use all the page's features. Please use the registration form, to register here or read more information about the registration process. If you are already registered, please login here.

gQt

Beginner

1

Tuesday, February 26th 2008, 10:42am

readLine won't work when connected to server

Hi,

I have a problem with the readLine function. It doesn't work while the computer is connected to the server. I have checked that the computer is connected to the server with the telnet command. I have modified the Fortune Client example, removed the readFortune-function and added a readLine() in the requestNewFortune. The last function is renamed to read_data. I have also added a waitForconnected test before the canReadLine test, but the if (canReadLine ) still fails. I have also tried to remove the if canReadLine test, but the readLine doesn't read anything. The program consists of three files: client.cpp, client.h, main.cpp
The data I'm trying to read looks like this: A new line is available each second, so the problem can't be that readline() can't find \n in the data.

$IIMWV,063,R,001.16,M,A*13
$IIMWV,042,R,002.66,M,A*14
$IIMWV,033,R,002.67,M,A*13
$IIMWV,041,R,001.71,M,A*12

My problem is that the client connects, but it's impossible to read the data.

The data comes with LF and CR, so the canReadLine function should detect a line available for reading.

Run example, output to terminal -terminated with quitbutton.

function read_data()
after connectToHost
wait for connected loop
function read_data()
after connectToHost
wait for connected loop
function read_data()
after connectToHost
wait for connected loop
function read_data()
after connectToHost
wait for connected loop
<Quit>



Any help is deeply appreciated, thanks in advance!

Regards
gQt


client.cpp:

#include <QtGui>
#include <QtNetwork>
#include "client.h"
#include <iostream.h>
#include <QtCore>
#include <qdebug.h>
Client::Client(QWidget *parent)
: QDialog(parent)
{
hostLabel = new QLabel(tr("&Server name:"));
portLabel = new QLabel(tr("S&erver port:"));
hostLineEdit = new QLineEdit("");
portLineEdit = new QLineEdit("");
portLineEdit->setValidator(new QIntValidator(1, 65535, this));

hostLabel->setBuddy(hostLineEdit);
portLabel->setBuddy(portLineEdit);
statusLabel = new QLabel(tr("This examples requires that you run the "
"Fortune Server example as well."));

getFortuneButton = new QPushButton(tr("Get Fortune"));
getFortuneButton->setDefault(true);
getFortuneButton->setEnabled(false);

quitButton = new QPushButton(tr("Quit"));

tcpSocket = new QTcpSocket(this);

connect(hostLineEdit, SIGNAL(textChanged(const QString &)),
this, SLOT(enableGetFortuneButton()));
connect(portLineEdit, SIGNAL(textChanged(const QString &)),
this, SLOT(enableGetFortuneButton()));
connect(getFortuneButton, SIGNAL(clicked()),
this, SLOT(read_data()));
connect(quitButton, SIGNAL(clicked()), this, SLOT(close()));
connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(read_data()));
connect(tcpSocket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(displayError(QAbstractSocket::SocketError)));

QHBoxLayout *buttonLayout = new QHBoxLayout;
buttonLayout->addStretch(1);
buttonLayout->addWidget(getFortuneButton);
buttonLayout->addWidget(quitButton);

QGridLayout *mainLayout = new QGridLayout;
mainLayout->addWidget(hostLabel, 0, 0);
mainLayout->addWidget(hostLineEdit, 0, 1);
mainLayout->addWidget(portLabel, 1, 0);
mainLayout->addWidget(portLineEdit, 1, 1);
mainLayout->addWidget(statusLabel, 2, 0, 1, 2);
mainLayout->addLayout(buttonLayout, 3, 0, 1, 2);
setLayout(mainLayout);

setWindowTitle(tr("Fortune Client"));
portLineEdit->setFocus();
}

void Client::read_data()
{
getFortuneButton->setEnabled(true);
cout << "function read_data()\n";
tcpSocket->abort();
tcpSocket->connectToHost(hostLineEdit->text(),
portLineEdit->text().toInt());

cout << ("after connectToHost\n");

if(tcpSocket->waitForConnected(-1))
{
cout <<"wait for connected loop\n";
if(tcpSocket->canReadLine())
{
mystring=tcpSocket->readLine();
qDebug() << "READ" << mystring;
cout <<"canReadLine loop after readLine\n";
}
statusLabel->setText(mystring);
getFortuneButton->setEnabled(false);
}

}
void Client::displayError(QAbstractSocket::SocketError socketError)
{
switch (socketError) {
case QAbstractSocket::RemoteHostClosedError:
break;
case QAbstractSocket::HostNotFoundError:
QMessageBox::information(this, tr("Fortune Client"),
tr("The host was not found. Please check the "
"host name and port settings."));
break;
case QAbstractSocket::ConnectionRefusedError:
QMessageBox::information(this, tr("Fortune Client"),
tr("The connection was refused by the peer. "
"Make sure the fortune server is running, "
"and check that the host name and port "
"settings are correct."));
break;
default:
QMessageBox::information(this, tr("Fortune Client"),
tr("The following error occurred: %1.")
.arg(tcpSocket->errorString()));
}

getFortuneButton->setEnabled(true);
}

void Client::enableGetFortuneButton()
{
getFortuneButton->setEnabled(!hostLineEdit->text().isEmpty()
&& !portLineEdit->text().isEmpty());
}



client.h:



#ifndef CLIENT_H
#define CLIENT_H
#include <QDialog>
#include <QTcpSocket>
#include <QAbstractSocket>

class QDialogButtonBox;
class QLabel;
class QLineEdit;
class QPushButton;
class QTcpSocket;
class Client : public QDialog
{
Q_OBJECT

public:
Client(QWidget *parent = 0);

private slots:
void read_data();
void displayError(QAbstractSocket::SocketError socketError);
void enableGetFortuneButton();

private:
QLabel *hostLabel;
QLabel *portLabel;
QLabel *cLabel;
QLineEdit *hostLineEdit;
QLineEdit *portLineEdit;
QLabel *statusLabel;
QPushButton *getFortuneButton;
QPushButton *quitButton;
QDialogButtonBox *buttonBox;

QTcpSocket *tcpSocket;
QString currentFortune;
QString mystring;
quint16 blockSize;

};

#endif

main.cpp

#include <QApplication>
#include "client.h"

int main(int argc, char *argv[])
{
QApplication app(argc, argv);
Client client;
client.show();
return client.exec();
}

This post has been edited 3 times, last edit by "gQt" (Feb 29th 2008, 8:05am)

  • Go to the top of the page

gQt

Beginner

2

Wednesday, February 27th 2008, 2:40pm

The problem was that I had to add a waitForReadyRead loop inside the waitForConnected loop, then it worked.
  • Go to the top of the page

Rate this thread