• 4310阅读
  • 1回复

[提问]qt的tcp通信 服务器和客户端读写数据的问题 [复制链接]

上一主题 下一主题
离线tsdl1234
 
只看楼主 倒序阅读 楼主  发表于: 2012-04-19
在qt自带的例子fortuneserver和fortuneclient里,server在client连接的时候会发送一条信息给client,用到了wrtie()函数,但是在client端接收的时候却没用read()函数,为什么?还有QDataStream定义的那个in和out是起什么作用的?如果我想在server发送给client端信息之后,client在回发server一个信息,应该怎么做?
谢谢各位

void Server::sendFortune()
{
//! [5]
    QByteArray block;
    QDataStream out(&block, QIODevice::WriteOnly);
    out.setVersion(QDataStream::Qt_4_0);
//! [4] //! [6]
    out << (quint16)0;
    out << fortunes.at(qrand() % fortunes.size());
    out.device()->seek(0);
    out << (quint16)(block.size() - sizeof(quint16));
//! [6] //! [7]

    QTcpSocket *clientConnection = tcpServer->nextPendingConnection();
    connect(clientConnection, SIGNAL(disconnected()),
            clientConnection, SLOT(deleteLater()));
//! [7] //! [8]

    clientConnection->write(block);
    clientConnection->disconnectFromHost();
//! [5]
}

void Client::readFortune()
{
//! [9]
    QDataStream in(tcpSocket);
    in.setVersion(QDataStream::Qt_4_0);

    if (blockSize == 0) {
        if (tcpSocket->bytesAvailable() < (int)sizeof(quint16))
            return;
//! [8]

//! [10]
        in >> blockSize;
    }

    if (tcpSocket->bytesAvailable() < blockSize)
        return;
//! [10] //! [11]

    QString nextFortune;
    in >> nextFortune;

    if (nextFortune == currentFortune) {
        QTimer::singleShot(0, this, SLOT(requestNewFortune()));
        return;
    }
//! [11]

//! [12]
    currentFortune = nextFortune;
//! [9]
    statusLabel->setText(currentFortune);
    getFortuneButton->setEnabled(true);
}
离线fish0619

只看该作者 1楼 发表于: 2012-04-20
`read()`在`QDataStream`里面被调用。`in`就是`input`的意思,`out`就是`output`的意思。去看看`QDataStream`的文档就知道了。
快速回复
限100 字节
 
上一个 下一个