一、服务端
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();
}
}