QLocalServer

QLocalServer

继承自QObject。

QLocalServer提供了一个基于本地套接字(socket)的服务端(server)。
QLocalServer可以接受来自本地socket的连接。
server通过调用listen(),监听特定的连接。
newConnection()是在每次server与client连接上时所发出的信号。
nextPendingConnection()将等待中的连接当作一个已连接上的QLocalSocket。返回值是指向QLocalSocket的指针,这个QLocalSocket可以与client建立通信。
当发生错误时,serverError() 返回错误的类型,调用errorString()可以获取对错误的描述。
在监听过程中,通过 serverName()可以获取当前server监听的名称。
close()使QLocalServer停止对连接请求的监听。
虽然QLocalServer是为在事件循环中使用而设计出来的,但是在没有事件循环时也是可以使用的。没有事件循环时,你必须使用waitForNewConnection(),它只在以下两种情况下解除阻塞:1)有可用的连接;2)超时。
============================================
                            函数方法描述
============================================
QLocalServer::QLocalServer ( QObject * parent = 0 )
创建一个新的本地socket的server。
通常使用这样的方式创建:
QLocalServer *myServer = new QLocalServer(this);


QLocalServer::~QLocalServer ()
销毁QLocalServer对象。
如果server正在监听连接,该方法会自动关闭这个监听。
必须在server delete之前将当前处于连接状态的client QLocalSockets断开连接(或者将client的QLocalSockets重定向)。


void QLocalServer::close ()
停止监听连接请求。
该操作不会影响已存在的连接,只是阻止新的连接。


QString QLocalServer::errorString () const
返回值是对serverError()上报的错误的详细描述。
如果错误内容没有适当的描述,则返回值为空字符串。


QString QLocalServer::fullServerName () const
返回server当前所监听的连接的完整路径。
注意:完整路径具有平台差异。


bool QLocalServer::hasPendingConnections () const   [virtual]
server有等待中的连接,返回true,否则返回false。


void QLocalServer::incomingConnection ( quintptr socketDescriptor )   [virtual protected]
当一个新的连接可用时,QLocalServer会调用这个虚函数。
参数socketDescriptor是确认连接时的本地套接字描述符。
该方法主要完成:创建一个QLocalSocket,设置好socket描述符,然后将这个QLocalSocket存入到待连接的一张内部列表中。最后发送newConnection()信号。
重写这个方法,可以在有可用连接时,改变server的行为。


bool QLocalServer::isListening () const
server正在监听连接,返回ture,否则返回false。


bool QLocalServer::listen ( const QString & name )
让server去监听名为name的连接请求。如果server此时正处于监听状态,则返回false。
name可以是简单的名字,QLocalServer将决定路径的正确形式。
serverName()返回传递给listen()的name。
通常,你只需要传入类似“foo”的name即可。在Unix上,这个name也可以是一个路径“/tmp/foo”,在windows上name也可以指定为一个管道路径“\\.\pipe\foo”。
注意:在Unix上,如果server没有关闭listen就crash了,会产生一个AddressInUseError的错误。要想再创建一个新的server,就需要移除这个file。在windows上,两个本地server可以同时监听同一个管道,此时连接请求发生时选择的server没有确定性,即会任意的选择server进行连接。


int QLocalServer::maxPendingConnections () const
返回可接受的最大的等待连接数。默认为30。


QLocalSocket * QLocalServer::nextPendingConnection ()   [virtual]
将下一个等待中的连接作为已连接上的QLocalSocket对象返回。
创建的这个socket被当作是server的后代,这意味着当server被销毁时,socket会被自动删除。
为避免内存浪费,仍然可以在使用完socket之后,显示的删除它。
当没有等待的连接时,调用该函数得到的返回值为0。


bool QLocalServer::removeServer ( const QString & name )   [static]
清除调用listen()失败的server实例。
调用该方法可以避免因先前的server实例未被清理彻底引起的crash。
在windows上,该方法什么都不做;在Unix上,它清除由name指定的socket。
警告:注意不要清除当前正处于运行状态的实例的socket。


QAbstractSocket::SocketError QLocalServer::serverError () const
返回上次发生的错误类型。
没有错误则返回NoError。


QString QLocalServer::serverName () const
如果server当前正在监听连接,则返回server的name。
否则,返回空字符串。


void QLocalServer::setMaxPendingConnections ( int numConnections )
将可接收的最大等待连接数设置为numConnections。
QLocalServer在调用nextPendingConnection()之前,最多只能接受numConnections个连接请求。
注意:尽管QLocalServer在等待的连接数目达到设置的最大值之后将不再接受新的连接请求,但是操作系统仍然会将这些新的连接请求保持在等待队列中,因为这些请求在连接上之后会给客户端发送信号。


bool QLocalServer::waitForNewConnection ( int msec = 0, bool * timedOut = 0 )
为了获得一个可用的连接请求,等待msec毫秒。
如果连接请求可用,返回ture,否则返回false。
操作超时并且timedOut不为0,则将*timedOut设置为ture。
这是一个阻塞调用。它通常用于简单单线程GUI应用程序,因为在该函数返回之前,整个应用程序将停止对其他事件的响应。
waitForNewConnection()大多使用在非事件驱动的应用程序中。
要实现该函数的功能,但又要使之不产生阻塞,参照newConnection ()信号的发送。
如果参数msec为-1,则该函数不超时。


============================================
                       信号(可理解为:cocoa中的notification)
============================================
void QLocalServer::newConnection ()   [signal]
每次有可用的新的连接时,就会发出这个信号。
<think>我们正在处理关于Qt中QLocalServer的使用方法和示例代码的请求。根据提供的引用,我们可以总结出以下关键点: 1. QLocalServer是一个基于本地套接字的服务器,用于同一台机器上的进程间通信(IPC)。 2. 基本使用步骤包括:创建QLocalServer对象,调用listen()方法开始监听,连接newConnection信号,在槽函数中调用nextPendingConnection()获取客户端连接(QLocalSocket)。 3. 监听时指定一个服务器名称(字符串),客户端通过该名称连接。 4. 提供了SocketOption来设置访问权限(在Linux和Windows上支持)。 5. 在Unix系统中,如果服务器崩溃而没有关闭监听,需要手动移除socket文件才能重新监听同一个名称。 根据这些信息,我们将编写一个简单的示例,展示如何创建一个本地服务器并处理客户端的连接。 注意:由于引用中提供了部分代码片段,我们将整合这些信息并编写一个完整的示例。 示例将包括: - 创建服务器并监听 - 设置服务器选项(可选) - 处理新连接 - 读取客户端发送的数据 - 向客户端发送回复 同时,我们也会考虑异常情况,比如监听失败的处理。 下面是一个简单的示例代码:</think>### Qt QLocalServer 使用教程 QLocalServer 是 Qt 提供的本地套接字服务器类,用于实现同一台机器上的进程间通信(IPC)。以下是详细使用方法和示例代码: #### 基本使用步骤 1. **创建服务器实例** ```cpp QLocalServer *server = new QLocalServer(this); ``` 2. **设置访问权限**(可选) ```cpp // 设置仅允许同一用户组的进程访问 server->setSocketOptions(QLocalServer::GroupAccessOption); ``` 3. **开始监听连接** ```cpp if (!server->listen("MyLocalServer")) { qDebug() << "监听失败:" << server->errorString(); return; } ``` 服务器名称 `"MyLocalServer"` 在系统中必须唯一,对应 Unixsocket 文件或 Windows 的命名管道[^1][^3]。 4. **处理新连接信号** ```cpp connect(server, &QLocalServer::newConnection, this, [=]{ QLocalSocket *client = server->nextPendingConnection(); // 处理客户端连接 }); ``` 5. **处理客户端通信** 在槽函数中通过 `QLocalSocket` 与客户端交互: ```cpp connect(client, &QLocalSocket::readyRead, this, [=]{ QByteArray data = client->readAll(); qDebug() << "收到数据:" << data; // 回复客户端 client->write("Message received"); }); ``` #### 完整示例代码 ```cpp #include <QLocalServer> #include <QLocalSocket> #include <QDebug> class LocalServer : public QObject { Q_OBJECT public: explicit LocalServer(QObject *parent = nullptr) : QObject(parent) { server = new QLocalServer(this); server->setSocketOptions(QLocalServer::WorldAccessOption); // 无访问限制[^2][^4] if (!server->listen("MyAppServer")) { qCritical() << "监听失败:" << server->errorString(); return; } connect(server, &QLocalServer::newConnection, this, &LocalServer::handleNewConnection); } private slots: void handleNewConnection() { QLocalSocket *client = server->nextPendingConnection(); connect(client, &QLocalSocket::readyRead, this, [=]{ QByteArray data = client->readAll(); qDebug() << "来自客户端的消息:" << data; // 回复确认 client->write("Server received: " + data); }); connect(client, &QLocalSocket::disconnected, client, &QLocalSocket::deleteLater); } private: QLocalServer *server; }; ``` #### 关键注意事项 1. **名称冲突处理** 在 Unix 系统中,如果服务器异常退出,需要手动删除 socket 文件才能重新监听同名服务: ```bash rm /tmp/MyAppServer ``` 否则会触发 `QLocalServer::AddressInUseError`[^3]。 2. **访问权限选项** | 选项值 | 权限说明 | |-------------------------|--------------------------------------------------------------------------| | `NoOptions` | 无访问限制(默认) | | `UserAccessOption` | 仅限同一用户进程访问 | | `GroupAccessOption` | 在 Linux 中限同组用户;Windows 中限进程主要组 | | `OtherAccessOption` | Linux 中除创建者外的所有用户;Windows 中所有用户 | | `WorldAccessOption` | 完全无限制[^2][^4] | 3. **跨平台行为差异** - **Windows**:允许多个服务器监听同一管道名,但客户端会随机连接其中一个[^3] - **Unix**:监听名称对应实际文件路径(通常位于 `/tmp`) 4. **错误处理** 检查 `server->error()` 和 `server->errorString()` 获取错误信息,常见错误: - `QLocalServer::AddressInUseError`:名称已被占用 - `QLocalServer::PermissionDeniedError`:权限不足 #### 典型应用场景 - 实现单实例应用(通过检测服务名是否存在) - 主进程与子进程通信 - 同一用户不同应用间的数据交换 - 插件与主程序通信
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值