Qt下应用QTcpServer与QTcpSocket实现Tcp控制(2)

客户端就没什么好说的了,也是对QTcpSocket的一些操作,但是注意要在程序开始时对服务器发起连接:
    tcpsocket=new QTcpSocket();
    tcpsocket->abort();
    tcpsocket->connectToHost(("127.0.0.1"),8888);
一些问题:很多大牛可能会说,我直接使用write read接受字符串命令可能并不安全,在实际应用中我发现,低频率的收发数据这种方法非常可靠,但是在很多客户端同时连接时,进行回调消息验证时,会出现信息残缺,我的解决方案是使用延时策略,但是这并不是长久之计。
按照官方给的例子:
服务端发送数据:
void Server::sendFortune()
{
    QByteArray block;
    QDataStream out(&block, QIODevice::WriteOnly);
    out.setVersion(QDataStream::Qt_4_0);
  out << (quint16)0;
    out << fortunes.at(qrand() % fortunes.size());
    out.device()->seek(0);
    out << (quint16)(block.size() - sizeof(quint16));
 QTcpSocket *clientConnection = tcpServer->nextPendingConnection();
    connect(clientConnection, SIGNAL(disconnected()),
            clientConnection, SLOT(deleteLater()));
  clientConnection->write(block);
    clientConnection->disconnectFromHost();
}

客户端接受数据:
void Client::readFortune()
{
    QDataStream in(tcpSocket);
    in.setVersion(QDataStream::Qt_4_0);

if (blockSize == 0) {
        if (tcpSocket->bytesAvailable() < (int)sizeof(quint16))
            return;

in >> blockSize;
    }

if (tcpSocket->bytesAvailable() < blockSize)
        return;
QString nextFortune;
    in >> nextFortune;

if (nextFortune == currentFortune) {
        QTimer::singleShot(0, this, SLOT(requestNewFortune()));
        return;
    }

currentFortune = nextFortune;
    statusLabel->setText(currentFortune);
    getFortuneButton->setEnabled(true);
}

缺点是每收发一回合信息,都要重连一次。

Ubuntu 环境下Gtk与QT编译环境安装与配置

Linux系统下QT环境搭建

Ubuntu下QT控制台程序无法运行的解决方案以及XTerm的配置方法

Ubuntu 10.04下QT4.7.4移植详解

Ubuntu 14.04下安装部署Qt5开发环境

Qt 的详细介绍请点这里
Qt 的下载地址请点这里

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/429f7fb4137e2e858f0a7d9371d3b27c.html