在前面QWSServer文章中,已经提到QWSClient代表QApplication或QWSDisplay。QWSClient保存了QT Client的部分信息来标识每个QT Client,这些信息保括client appname, clientid。 QWSClient的主要功能还是负现QWSDiplay与QWSServer的通讯,QWSDisplay将QWSCommand发给QWSClient(QWSClient::readMore), 同时QWSServer的QWSEvent也经由QWSClient发送给QWSDisplay(QWSClient::sendEvent)。 下面详细阐述一下QWSDisplay与QWSServer的建立联系过程。 1.QWSDiplay和QWSServer的连接过程 整个连接过程分为三步: QWSServer建立server socket, QWSDisplay发起连接请求, QWSServer响应请求建立QWSClient。 (1)QWSServer建立server socket 先看一下QWSServer的类继承顺序:QWSServer-->QWSServerSocket-->QServerSocket。 QServerSocket是server socket的一个封装。QWSServerSocket则是将所建立的server socket限制为unix domain socket. 最后,经过一系列构造过程和系统调用socket,bind,listen,最后调用QServerSocket::setSocket完成过程。 最终结果是,QWSServer在qws_qtePipeFilename()上listen连接请求,有请求到来时,执行QWSServer::newConnection(int socket )。 (2)QWSDisplay发起连接请求 QApplication在构造QWSDiplay过程,发起向QWSServer的连接请求,具体过程如下: QApplication::construct-->qt_init-->init_display-->qt_fbdpy = new QWSDisplay()-->new QWSDisplay: ![]() class QWSDisplay: ![]() public: Data( QObject* parent, bool singleProcess = FALSE ) { ......... csocket = new QWSSocket(parent); ......... init(); } void QWSDisplay: ![]() { ...................... QString pipe = qws_qtePipeFilename(); sharedRamSize = qwsSharedRamSize; #ifndef QT_NO_QWS_MULTIPROCESS if ( csocket ) { // QWS client csocket->connectToLocalFile(pipe); ........................ } (3)QWSServer响应请求建立QWSClient 在csocket->connectToLocalFile(pipe)后,QWSServer收到请求后,执行QWSServer::newConnection(int socket )。 void QWSServer::newConnection( int socket ) { client[socket] = new QWSClient(this,socket, get_object_id()); ............ } 至此,QWSDiplay就和QWSServer建立了连接,QWSClient也建立起来。 之后,QWSClient通过QWSClient::readMoreCommand读取QWSDisplay: ![]() |