分享

实现QT与Flex、Flash的通信(基于Socket)

 QomoIT 2014-07-03

实现QT与Flex、Flash的通信(基于Socket)

分类: QT Flex Flash 537人阅读 评论(1) 收藏 举报

        在Windows下,Flex可以通过ActiveX方式通过ExterneralInterface接口与Qt通信,但是在Linux下,ExternalInterface方法就无效了,只能通过Socket方式与Qt通信。进行通信的两端Flex与Qt,需要绑定指定的端口,监听端口发送的数据(字符串),双方做出相应的响应。下面展示一个Qt与Flex进行文字交互的实例,如下图所示。

                       

       在QT端,首先在主窗口中调用其成员函数initSocket()初始化QTcpSocket连接,调用openSwf()函数初始化窗口部件QWebView,并将Flash嵌入到webView中。

  1. void Widget::initSocket()  
  2.   
  3. {  
  4.   
  5.     process= new QProcess(this);  
  6.   
  7.    m_server = new QTcpServer(this);  
  8.   
  9.    if(true == (m_server->listen(QHostAddress::LocalHost,5150)))  
  10.   
  11.     {  
  12.   
  13.         qDebug() << "bandsuccess!";  
  14.   
  15.     }  
  16.   
  17.    connect(m_server, SIGNAL(newConnection()),this, SLOT(FlexConnected()));  
  18.   
  19. }  

        在initSocket()函数中,调用QTcpServer::listen()方法绑定IP和端口地址,并且将newConnection()信号与flash连接完毕FlexConnected()槽相关联。在FlexConnected()槽中,将readyRead()信号与处理TCP数据流接收和处理readPendingDatagrams()槽相关联。在Flex端,首先构造一个QTSocket对象,然后在其构造函数中初始化IP地址、端口和Flex提供的Socket对象,最后调用InitConnect()函数初始化连接。

  1. public function InitConnect():void  
  2.   
  3. {  
  4.          socket.connect(server,port);  
  5.   
  6.     //监听套接字连接是否关闭   
  7.   
  8.          socket.addEventListener(Event.CLOSE,closeHandler);  
  9.   
  10.     //监听是否连接上服务器   
  11.   
  12.          socket.addEventListener(Event.CONNECT,connectHandler);  
  13.   
  14.          socket.addEventListener(IOErrorEvent.IO_ERROR,ioErrorHandler);  
  15.   
  16.          socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR,securityErrorHandler);  
  17. }  
     下面代码是整个工程的代码,包含QT部分和Flex部分。

     QT部分代码:

  1. // widget.h   
  2.   
  3. class Widget : public QWidget  
  4.   
  5. {  
  6.   
  7.    Q_OBJECT  
  8.   
  9. public:  
  10.   
  11.    explicit Widget(QWidget *parent = 0);  
  12.   
  13.    ~Widget();  
  14.   
  15.    void openSwf();  
  16.   
  17.    void processTheDatagram(QByteArray array);  
  18.   
  19. private slots:  
  20.   
  21.    void on_pushButton_clicked();  
  22.   
  23.    void readPendingDatagrams();  
  24.   
  25.    void FlexConnected();  
  26.   
  27. private:  
  28.   
  29.    void initSocket();  
  30.   
  31. private:  
  32.   
  33.    Ui::Widget *ui;  
  34.   
  35.    QTcpServer *m_server;  
  36.   
  37.    QTcpSocket *m_socket;  
  38.   
  39.    QProcess* process;  
  40.   
  41.    QString tempDir;  
  42.   
  43.    QString tempFilename;  
  44.   
  45. };  
  46.   
  47.    
  48.   
  49. //widget.cpp   
  50.   
  51. #define TEMP_DIR     "/temp/"  
  52.   
  53. #define TEMP_FILE    "QTFLEX/QTFLEX.html"  
  54.   
  55. #define REPLACE_STRING "{#AAA}"  
  56.   
  57. Widget::Widget(QWidget *parent) :  
  58.   
  59.    QWidget(parent),ui(new Ui::Widget)  
  60.   
  61. {  
  62.   
  63.    ui->setupUi(this);  
  64.   
  65.    tempDir = qApp->applicationDirPath() + TEMP_DIR;  
  66.   
  67.     qDebug()<< "tempDir: " << tempDir;  
  68.   
  69.    tempFilename = tempDir + TEMP_FILE;  
  70.   
  71.    qDebug() << "tempFilename" << tempFilename;  
  72.   
  73.    initSocket();  
  74.   
  75.    openSwf();  
  76.   
  77. }  
  78.   
  79. Widget::~Widget()  
  80.   
  81. {  
  82.   
  83.    m_server->close();  
  84.   
  85.    delete m_server;  
  86.   
  87.    delete process;  
  88.   
  89. }  
  90.   
  91. void Widget::initSocket()  
  92.   
  93. {  
  94.   
  95.    process = new QProcess(this);  
  96.   
  97.    m_server = new QTcpServer(this);  
  98.   
  99.    if(true == (m_server->listen(QHostAddress::LocalHost,5150)))  
  100.   
  101.     {  
  102.   
  103.        qDebug() << "band success!";  
  104.   
  105.     }  
  106.   
  107.    connect(m_server, SIGNAL(newConnection()),this, SLOT(FlexConnected()));  
  108.   
  109. }  
  110.   
  111. //Flex连接上事件   
  112.   
  113. void Widget::FlexConnected()  
  114.   
  115. {  
  116.   
  117.    qDebug() << "flash连接成功!";  
  118.   
  119.    m_socket = m_server->nextPendingConnection();  
  120.   
  121.    connect(m_socket,SIGNAL(readyRead()),this,SLOT(readPendingDatagrams()));  
  122.   
  123. }  
  124.   
  125. QByteArray CreatePolicy()  
  126.   
  127. {  
  128.   
  129.    char szPolicy[1024] = "";  
  130.   
  131.    memset(szPolicy,'\0',1024);  
  132.   
  133.    strcat(szPolicy,"<?xml version='1.0'?>");  
  134.   
  135.    strcat(szPolicy,"<cross-domain-policy>");  
  136.   
  137.    strcat(szPolicy,"<site-control permitted-cross-domain-policies='all'/>");  
  138.   
  139.    strcat(szPolicy,"<allow-access-from domain='*'to-ports='5150'/>");  
  140.   
  141.    strcat(szPolicy,"</cross-domain-policy>");  
  142.   
  143.    return QByteArray(szPolicy);  
  144.   
  145. }  
  146.   
  147. void Widget::readPendingDatagrams()  
  148.   
  149. {  
  150.   
  151.    qDebug() << "准备接受!";  
  152.   
  153.    QByteArray datagram;  
  154.   
  155.    datagram = m_socket->readAll();  
  156.   
  157.    m_socket->seek(0);  
  158.   
  159.    if(0 ==(strcmp("<policy-file-request/>",datagram.constData() )))  
  160.   
  161.     {  
  162.   
  163.        //首先发送安全协商报文,然后关闭socket,等待Flex重新连接   
  164.   
  165.        qDebug() << "安全认证完毕!";  
  166.   
  167.        QByteArray strPolicy = CreatePolicy();  
  168.   
  169.        m_socket->write(strPolicy);  
  170.   
  171.        m_socket->close();  
  172.   
  173.     }  
  174.   
  175.    else  
  176.   
  177.     {  
  178.   
  179.        processTheDatagram(datagram);  
  180.   
  181.     }  
  182.   
  183. }  
  184.   
  185. void Widget::openSwf()  
  186.   
  187. {  
  188.   
  189.    //设置webkit参数   
  190.   
  191.    QWebSettings *set = QWebSettings::globalSettings();  
  192.   
  193.     set->setAttribute(QWebSettings::JavascriptEnabled,true);  
  194.   
  195.    set->setAttribute(QWebSettings::PluginsEnabled,true);  
  196.   
  197.    set->setAttribute(QWebSettings::JavascriptCanOpenWindows,true);  
  198.   
  199.    set->setAttribute(QWebSettings::DeveloperExtrasEnabled,true);  
  200.   
  201.    QString dirPath = qApp->applicationDirPath();  
  202.   
  203.    dirPath = dirPath.left(dirPath.lastIndexOf('/'));  
  204.   
  205.    qDebug() << dirPath;  
  206.   
  207.    ui->webView->load(QUrl(tempFilename));  
  208.   
  209.    ui->webView->show();  
  210.   
  211. }  
  212.   
  213. void Widget::processTheDatagram(QByteArrayarr)  
  214.   
  215. {  
  216.   
  217.    qDebug()<<"comming";  
  218.   
  219.    QString s="";  
  220.   
  221.    s.append(arr);  
  222.   
  223.    ui->textEdit->append(s);  
  224.   
  225. }  
  226.   
  227. void Widget::on_pushButton_clicked()  
  228.   
  229. {  
  230.   
  231.     QString str=ui->lineEdit->text();  
  232.   
  233.     if(str==NULL || str=="")  
  234.   
  235.     {  
  236.   
  237.       return;  
  238.   
  239.     }  
  240.   
  241.    else  
  242.   
  243.     {  
  244.   
  245.       str="QT:"+str;  
  246.   
  247.       ui->textEdit->append(str);  
  248.   
  249.       m_socket->write(str.toAscii());  
  250.   
  251.       m_socket->close();  
  252.   
  253.     }  
  254.   
  255. }  

    Flex部分代码,在Flex3下编译通过:

  1. //QTFLEX.mxml   
  2. <mx:Script>  
  3.   
  4.         <![CDATA[  
  5.   
  6.            import mx.controls.Alert;  
  7.   
  8.            public var socket:QTSocket;  
  9.   
  10.              
  11.   
  12.                  public function initApp():void  
  13.   
  14.                  {  
  15.   
  16.                      socket=new QTSocket();  
  17.   
  18.                             socket.InitConnect();  
  19.   
  20.                  }  
  21.   
  22.                  public function sendMsg():void  
  23.   
  24.                  {  
  25.   
  26.                     var str:String=msg.text;  
  27.   
  28.                     if(str==null ||str=="")  
  29.   
  30.                     {  
  31.   
  32.                          Alert.show("发送内容不能为空!");  
  33.   
  34.                          return;  
  35.   
  36.                      }  
  37.   
  38.                      str="FLEX:"+str;  
  39.   
  40.                      AddMsgToArea(str);  
  41.   
  42.                      socket.MsgSendHandler(str);  
  43.   
  44.                  }  
  45.   
  46.                  public functionAddMsgToArea(str:String):void  
  47.   
  48.                  {  
  49.   
  50.                       varstr1:String=ta.text;  
  51.   
  52.                       ta.text=str1+"\n"+str;  
  53.   
  54.                  }  
  55.   
  56.         ]]>  
  57.   
  58.  </mx:Script>  
  59.   
  60. <mx:Button x="188" y="264"label="发送" height="26" width="62"click="sendMsg();"/>  
  61.   
  62. <mx:TextInput x="10"y="264" width="170" height="26"id="msg"/>  
  63.   
  64. <mx:TextArea x="4"y="6" height="250" width="247"id="ta"/>  
  65.   
  66. </mx:Application>  
  67.   
  68.    
  69.   
  70. // QTSocket.as   
  71.   
  72. package  
  73.   
  74. {  
  75.   
  76.          importflash.net.Socket;  
  77.   
  78.          importflash.events.*;  
  79.   
  80.          importflash.utils.ByteArray;  
  81.   
  82.          importmx.controls.Alert;  
  83.   
  84.          publicclass QTSocket  
  85.   
  86.          {  
  87.   
  88.                    publicvar server:String;  
  89.   
  90.                    publicvar port:int=5150;  
  91.   
  92.                    publicvar socket:Socket=null;  
  93.   
  94.                    publicfunction QTSocket()  
  95.   
  96.                    {  
  97.   
  98.                             server="localhost";  
  99.   
  100.                             port=5150;  
  101.   
  102.                             socket=newSocket();  
  103.   
  104.                    }  
  105.   
  106.                    //Socket初始化   
  107.   
  108.                    publicfunction InitConnect():void  
  109.   
  110.                    {  
  111.   
  112.                             socket.connect(server,port);  
  113.   
  114.                             //监听套接字连接是否关闭   
  115.   
  116.                             socket.addEventListener(Event.CLOSE,closeHandler);  
  117.   
  118.                             //监听是否连接上服务器   
  119.   
  120.                             socket.addEventListener(Event.CONNECT,connectHandler);  
  121.   
  122.                             socket.addEventListener(IOErrorEvent.IO_ERROR,ioErrorHandler);  
  123.   
  124.                             socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR,  
  125.   
  126.                                                                                                        securityErrorHandler);  
  127.   
  128.                    }  
  129.   
  130.                    //发送消息   
  131.   
  132.                    publicfunction MsgSendHandler(msg:String):void  
  133.   
  134.                    {  
  135.   
  136.                             if(socket != null)  
  137.   
  138.                             {  
  139.   
  140.                                      varbytes:ByteArray=new ByteArray(); //新建一个ByteArray存放数据   
  141.   
  142.                                      bytes.writeUTFBytes(msg);  
  143.   
  144.                                      //写入数据,以utf-8格式传数据避免中文乱码   
  145.   
  146.                                      socket.writeBytes(bytes);  
  147.   
  148.                                      socket.flush();  
  149.   
  150.                             }  
  151.   
  152.                    }  
  153.   
  154.                    //Socket接到消息   
  155.   
  156.                    publicfunction MsgRecvedHandler(event:ProgressEvent):void  
  157.   
  158.                    {  
  159.   
  160.                             vararray:ByteArray=new ByteArray();  
  161.   
  162.                             socket.readBytes(array);  
  163.   
  164.                             varmsg:String=new String(array);  
  165.   
  166.            Alert.show(msg);  
  167.   
  168.                    }  
  169.   
  170.                    privatefunction connectHandler(event:Event):void  
  171.   
  172.                   {  
  173.   
  174.                             trace("connectHandler:" + event);  
  175.   
  176.                             socket.addEventListener(ProgressEvent.SOCKET_DATA,MsgRecvedHandler);  
  177.   
  178.                             MsgSendHandler("str");//消息体   
  179.   
  180.                    }  
  181.   
  182.                    privatefunction closeHandler(event:Event):void  
  183.   
  184.                    {  
  185.   
  186.                             trace("closeHandler:" + event);  
  187.   
  188.                    }  
  189.   
  190.                    privatefunction ioErrorHandler(event:IOErrorEvent):void  
  191.   
  192.                    {  
  193.   
  194.                             trace("ioErrorHandler:" + event);  
  195.   
  196.                    }  
  197.   
  198.                    privatefunction securityErrorHandler(event:SecurityErrorEvent):void  
  199.   
  200.                    {  
  201.   
  202.                             trace("securityErrorHandler:" + event);  
  203.   
  204.                    }  
  205.   
  206.          }  
  207.   
  208. }  


    阿科

    2013年1月6日于北京邮电大学新科研楼302室


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多