1

I try to send strings from client to server line by line in a foreach loop:

foreach(QString s, stringlist)
   client.sendMessage(s);

But the client receives only first string. When I remove "\n" from a string, server receives a bunch of strings merged together in one big string. I thought that adding "\n" would divide the data to strings which I can read with readLine(). What have I missed?

My client

class cClient:public QTcpSocket
{
public:
    void sendMessage(QString text)
    {
        text = text + "\n";
        write(text.toUtf8());        
    }
};

and server:

class pServer:public QTcpServer
{
    Q_OBJECT
public:
    pServer()
    {
        connect(this,SIGNAL(newConnection()),SLOT(slotNewConnection()));
    }

public slots:
    void slotNewConnection()
    {
        QTcpSocket* c = nextPendingConnection();
        connect(c,SIGNAL(readyRead()),this, SLOT(readData()));
    }

    void readData()
    {
        QTcpSocket* conn = qobject_cast<QTcpSocket*>(sender());
        QString data = QString(conn->readLine());
    }
};
lena
  • 1,181
  • 12
  • 36

1 Answers1

3

You are probably receiving more than one line at the time but only reading the first one. Read as many lines as available by checking with canReadLine. Something like that:

void readData()
{
    QTcpSocket* conn = qobject_cast<QTcpSocket*>(sender());
    QStringList list;
    while (conn->canReadLine())
    {
        QString data = QString(conn->readLine());
        list.append(data);
    }     
}
talamaki
  • 5,324
  • 1
  • 27
  • 40