qt的tcp通信 服务器和客户端读写数据的问题
在qt自带的例子fortuneserver和fortuneclient里,server在client连接的时候会发送一条信息给client,用到了wrtie()函数,但是...
在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);
} 展开
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);
} 展开
1个回答
展开全部
首先回答第一个问题,读和写可以有多种实现方式,用write和read只是其中一种,前面一个函数中的 clientConnection->write(block)是调用了QTcpSocket 类中的write方法来实现,如果你想不用此方法调用类中的read和write方法,就是你问的第二个问题,in和out的作用,in和out在这里将对socket中的报文收发变为数据流的形式来操作,QDataStream in(tcpSocket)比如这一句是将tcpSocket这个连接的实例对象作为一个文件描述符传递给QDataStream,然后 in >> blockSize这句话实现的就是相当于read的操作,就是将数据流读出来。这个 out << (quint16)(block.size() - sizeof(quint16))是写入。实际上对诸如串口收发,读写文件,socket通信等等,用C语言来写,抽象出来都是对文件描述符进行操作,都可以用write和read来做,所以,实际上,第一种方法和第二种方法是一样的,就看你选择什么样的方法了,第三个问题可参考out << (quint16)(block.size() - sizeof(quint16))这样的方法在收到数据以后把数据发出去。
请给分。。。
请给分。。。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询