Qt网络编程:QLocalSocket使用示例

一、服务端

    server = new QLocalServer(this);
    if (!server->listen("fortune"))
    {
        qDebug()<<"无法启动服务端:"<<server->errorString();
    }
    connect(server, &QLocalServer::newConnection, this, &Server::sendFortune);

//向客户端发送消息
void Server::sendFortune()
{
    QByteArray block;
    QDataStream out(&block, QIODevice::WriteOnly);
    out.setVersion(QDataStream::Qt_DefaultCompiledVersion);
    out << (quint16)0;
    out << QString("我是消息");
    out.device()->seek(0);
    out << (quint16)(block.size() - sizeof(quint16));

    QLocalSocket *clientConnection = server->nextPendingConnection();
    connect(clientConnection, &QLocalSocket::disconnected, clientConnection, &QLocalSocket::deleteLater);

    clientConnection->write(block);
    clientConnection->flush();
    clientConnection->disconnectFromServer();
}

二、客户端

    socket = new QLocalSocket(this);//用于本地网络通信的套接字
    connect(socket, &QIODevice::readyRead, this, &Client::readFortune);
    connect(socket, static_cast<void(QLocalSocket::*)(QLocalSocket::LocalSocketError)>(&QLocalSocket::error), this, &Client::displayError);
    quint16 blockSize;

//获取服务端消息
void Client::requestNewFortune()
{
    blockSize = 0;
    socket->abort();//断开当前的连接并重设socket
    socket->connectToServer("Fortune");//连接服务端
}

//读取服务端发过来的消息
void Client::readFortune()
{
    QDataStream in(socket);
    in.setVersion(QDataStream::Qt_DefaultCompiledVersion);

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

    if (in.atEnd())
    {
        return;
    }

    QString nextFortune;
    in >> nextFortune;
    
    qDebug()<<"获取的消息:"<<nextFortune;
}

void Client::displayError(QLocalSocket::LocalSocketError socketError)
{
    switch (socketError)
    {
        case QLocalSocket::ServerNotFoundError:
            qDebug()<<"连接错误,请检查连接名称";
            break;
        case QLocalSocket::ConnectionRefusedError:
            qDebug()<<"连接被拒绝,确保服务端正在运行";
            break;
        case QLocalSocket::PeerClosedError:
            break;
        default:
            qDebug()<<"发生以下错误: %1."<<socket->errorString();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值