? 英创Linux主板Qt网络应用程序简介--技术天地

英創Linux主板Qt網絡應用程序簡介

 2014/5/29    

  在Linux中的網絡編程是通過socket接口來進行的。我們常說的socket接口是一種特殊的I/O,它也是一種文件描述符,關于socket編程的應用可以參考英創公司光盤中使用必讀的相關內容。

 

  現在在英創公司提供的例程Step3_TCPServe基礎上,加入Qt顯示單元,使其能通過顯示屏進行操作,基本的思想是還是利用Qt的信號和插槽機制進行對象間的通訊,當接收到的數據的時候,發出Signal,Qt 的事件循環中接收到這個信號,調用定義好的Slot顯示接收到的數據。

 

  Step3_TCPServe是一個支持多個客戶端的連接TCPServer示例,該例程采用了面向對象的C++編程,創建了CTCPServer和CTCPCustom兩個類,其中CTCPServer類負責偵聽客戶端的連接,一旦有客戶端請求連接,它就負責接受此連接,并創建一個新的CTCPCustom類對象與客戶端進行通訊,然后CTCPServer類接著監聽客戶端的連接請求,所以需要讓CTCPServer類和CTCPCustom類繼承QObject類的屬性,使QObject成為CTCPServer類和CTCPCustom類的基類,然后在CTCPServer類和CTCPCustom類中各加入一個signal,讓CTCPServer類和CTCPCustom類的信號關聯,這樣當CTCPCustom類發出信號CTCPServer類也會發出信號,再讓CTCPServer類的信號和Qt顯示通過信號和插槽的機制連接,但是對于網絡通信的操作部分并不用做修改,原理如下圖:

 

 

  繼承QObject類的屬性,加入信號和槽的方法在《英創Linux主板Qt串口應用程序簡介》中有較詳細的說明,在CTCPCustom類中,添加的方法也一樣,當判斷接收到數據時,發送信號,添加程序:

  emit pSocket->readyRead(pSocket->RecvBuf);

 

  在前面提到,在CTCPServer類中,當判斷有客戶端請求連接時,會創建一個CTCPCustom類對象與客戶端進行通訊,這時再將CTCPServer類和CTCPCustom類的信號關聯:

  connect(pClientSocket,SIGNAL(readyRead(QString)),pSocket,SIGNAL(readyRead(QString)));

 

  在Qt中,將兩個信號關聯,如同上面那樣,當pSocket中的信號發送時,pClientSocket中的信號也會跟著發送。

 

  最后在顯示窗口Widget類中,將CTCPServer類的信號和顯示槽函數關聯:

  connect(m_TCPServer,SIGNAL(readyRead(QString)),this,SLOT(readData(QString)),Qt::QueuedConnection);

 

  然后可以在顯示界面中添加了一些其他功能組件,比如按鈕等,然后編寫組件的事件響應函數,實現想要的功能,在本例程中,添加了一些按鈕和顯示,用來選擇啟動TCPServer,顯示IP和端口號等,部分實現代碼如下:

 

  void Widget::on_startpushButton_clicked() //偵聽按鈕
  {
    char buff_1[16],buff_2[16];
    m_TCPServer=new CTCPServer;
    m_TCPServer->m_LocalPort = 1001;
    if((m_TCPServer->Open())<0)
    {
      QMessageBox::information(this,tr('錯誤'),tr('創建失敗'),QMessageBox::Yes);
      delete m_TCPServer;
      return;
    }
    connect(m_TCPServer,SIGNAL(readyRead(QString)),this,SLOT(readData(QString)),Qt::QueuedConnection); //關聯信號和槽
    ui->startpushButton->setEnabled(false);
    ui->textBrowser_3->setEnabled(true);
    QString s=QString::number(m_TCPServer->m_LocalPort,10);
    ui->textBrowser_3->insertPlainText(s); //顯示端口號
    ui->textBrowser_2->setEnabled(true);
    if((m_TCPServer->get_inetip('eth0',buff_1))==0)
    {
      //顯示eth0的IP地址
      ui->textBrowser_2->append( QString(QLatin1String(buff_1)));
    }
    if((m_TCPServer->get_inetip('eth1',buff_2))==0)
    {
      //顯示eth1的IP地址
      ui->textBrowser_2->append( QString(QLatin1String(buff_2)));
    }
    ui->closepushButton->setEnabled(true);
  }

 

  最后在工程中添加main.cpp,在main函數中,主要是對字體進行設置,并且顯示我們設計的窗口:

 

  int main( int argc,char* argv[] )
  {
    QApplication a(argc, argv);
    QFont font('simsun',9,QFont::Bold); //設置字體
    QTextCodec::setCodecForTr(QTextCodec::codecForName('utf8'));
    a.setFont(font);
    Widget w;
    w.show();
    return a.exec(); //返回Qt事件循環
  }

 

  程序運行效果: