Как отправлять и читать строковые строки через QTcpSocket?

Я пытаюсь отправить строки с клиента на сервер построчно в цикле foreach:

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

Но клиент получает только первую строку. Когда я удаляю "\n" из строки, сервер получает набор строк, объединенных в одну большую строку. Я думал, что добавление "\n" разделит данные на строки, которые я могу прочитать с помощью readLine(). Что я пропустил?

Мой клиент

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

и сервер:

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());
    }
};

person lena    schedule 26.09.2016    source источник


Ответы (1)


Вероятно, вы получаете более одной строки за раз, но читаете только первую. Прочитайте столько строк, сколько доступно, проверив с помощью canReadLine. Что-то такое:

void readData()
{
    QTcpSocket* conn = qobject_cast<QTcpSocket*>(sender());
    QStringList list;
    while (conn->canReadLine())
    {
        QString data = QString(conn->readLine());
        list.append(data);
    }     
}
person talamaki    schedule 26.09.2016
comment
Спасибо! Это именно то, что я пропустил. Теперь все работает! - person lena; 26.09.2016