QLocalServer的简单实用


        QLocalServer这个类继承自QObject。


        QLocalServer提供了一个基于本地套接字(socket)的服务端(server)。

        QLocalServer可以接受来自本地socket的连接。

        server通过调用listen(),监听特定的连接。


        1:newConnection()是在每次server与client连接上时所发出的信号。

        2:nextPendingConnection()将等待中的连接当作一个已连接上的QLocalSocket。返回值是指向QLocalSocket的指针,这个QLocalSocket可以与client建立通信。

        3:当发生错误时,serverError() 返回错误的类型,调用errorString()可以获取对错误的描述。

        4:在监听过程中,通过 serverName()可以获取当前server监听的名称。

        5: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重定向)。


5.gif

        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。


13.gif


        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,则该函数不超时。


        void QLocalServer::newConnection ()   [signal]

        每次有可用的新的连接时,就会发出这个信号。


        代码下载:github地址

上一篇 下一篇