QT Embedded之QWSClient

http://blog.sina.com.cn/s/blog_4da8de1e01012uet.html
http://blog.sina.com.cn/s/articlelist_1302912542_4_1.html

在前面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::Data();
      class QWSDisplay::Data {
      public:
        Data( QObject* parent, bool singleProcess = FALSE )
        {
           .........
                 csocket = new QWSSocket(parent);
           .........
           init();
        }
      
        void QWSDisplay::Data::init()
      {
   ......................
        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::Data::csocket发来的消息,放入commandQueue中等待QWSServer处理。同时QWSServer利用QWSClient::sendEvent将QWSEvent发送给QWSDisplay。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值