在Linux中的網(wǎng)絡(luò)編程是通過socket接口來進(jìn)行的。我們常說的socket接口是一種特殊的I/O,它也是一種文件描述符,關(guān)于socket編程的應(yīng)用可以參考英創(chuàng)公司光盤中使用必讀的相關(guān)內(nèi)容。
現(xiàn)在在英創(chuàng)公司提供的例程Step3_TCPServe基礎(chǔ)上,加入Qt顯示單元,使其能通過顯示屏進(jìn)行操作,基本的思想是還是利用Qt的信號(hào)和插槽機(jī)制進(jìn)行對(duì)象間的通訊,當(dāng)接收到的數(shù)據(jù)的時(shí)候,發(fā)出Signal,Qt 的事件循環(huán)中接收到這個(gè)信號(hào),調(diào)用定義好的Slot顯示接收到的數(shù)據(jù)。
Step3_TCPServe是一個(gè)支持多個(gè)客戶端的連接TCPServer示例,該例程采用了面向?qū)ο蟮?a href="http://www.delux-kingway.cn/tags/C++/" target="_blank">C++編程,創(chuàng)建了CTCPServer和CTCPCustom兩個(gè)類,其中CTCPServer類負(fù)責(zé)偵聽客戶端的連接,一旦有客戶端請(qǐng)求連接,它就負(fù)責(zé)接受此連接,并創(chuàng)建一個(gè)新的CTCPCustom類對(duì)象與客戶端進(jìn)行通訊,然后CTCPServer類接著監(jiān)聽客戶端的連接請(qǐng)求,所以需要讓CTCPServer類和CTCPCustom類繼承QObject類的屬性,使QObject成為CTCPServer類和CTCPCustom類的基類,然后在CTCPServer類和CTCPCustom類中各加入一個(gè)signal,讓CTCPServer類和CTCPCustom類的信號(hào)關(guān)聯(lián),這樣當(dāng)CTCPCustom類發(fā)出信號(hào)CTCPServer類也會(huì)發(fā)出信號(hào),再讓CTCPServer類的信號(hào)和Qt顯示通過信號(hào)和插槽的機(jī)制連接,但是對(duì)于網(wǎng)絡(luò)通信的操作部分并不用做修改,原理如下圖:
繼承QObject類的屬性,加入信號(hào)和槽的方法在《英創(chuàng)Linux主板Qt串口應(yīng)用程序簡(jiǎn)介》中有較詳細(xì)的說明,在CTCPCustom類中,添加的方法也一樣,當(dāng)判斷接收到數(shù)據(jù)時(shí),發(fā)送信號(hào),添加程序:
emit pSocket->readyRead(pSocket->RecvBuf);
在前面提到,在CTCPServer類中,當(dāng)判斷有客戶端請(qǐng)求連接時(shí),會(huì)創(chuàng)建一個(gè)CTCPCustom類對(duì)象與客戶端進(jìn)行通訊,這時(shí)再將CTCPServer類和CTCPCustom類的信號(hào)關(guān)聯(lián):
connect(pClientSocket,SIGNAL(readyRead(QString)),pSocket,SIGNAL(readyRead(QString)));
在Qt中,將兩個(gè)信號(hào)關(guān)聯(lián),如同上面那樣,當(dāng)pSocket中的信號(hào)發(fā)送時(shí),pClientSocket中的信號(hào)也會(huì)跟著發(fā)送。
最后在顯示窗口Widget類中,將CTCPServer類的信號(hào)和顯示槽函數(shù)關(guān)聯(lián):
connect(m_TCPServer,SIGNAL(readyRead(QString)),this,SLOT(readData(QString)),Qt::QueuedConnection);
然后可以在顯示界面中添加了一些其他功能組件,比如按鈕等,然后編寫組件的事件響應(yīng)函數(shù),實(shí)現(xiàn)想要的功能,在本例程中,添加了一些按鈕和顯示,用來選擇啟動(dòng)TCPServer,顯示IP和端口號(hào)等,部分實(shí)現(xiàn)代碼如下:
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('錯(cuò)誤'),tr('創(chuàng)建失敗'),QMessageBox::Yes);
delete m_TCPServer;
return;
}
connect(m_TCPServer,SIGNAL(readyRead(QString)),this,SLOT(readData(QString)),Qt::QueuedConnection); //關(guān)聯(lián)信號(hào)和槽
ui->startpushButton->setEnabled(false);
ui->textBrowser_3->setEnabled(true);
QString s=QString::number(m_TCPServer->m_LocalPort,10);
ui->textBrowser_3->insertPlainText(s); //顯示端口號(hào)
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函數(shù)中,主要是對(duì)字體進(jìn)行設(shè)置,并且顯示我們?cè)O(shè)計(jì)的窗口:
int main( int argc,char* argv[] )
{
QApplication a(argc, argv);
QFont font('simsun',9,QFont::Bold); //設(shè)置字體
QTextCodec::setCodecForTr(QTextCodec::codecForName('utf8'));
a.setFont(font);
Widget w;
w.show();
return a.exec(); //返回Qt事件循環(huán)
}
程序運(yùn)行效果:
-
Linux
+關(guān)注
關(guān)注
87文章
11351瀏覽量
210497 -
嵌入式主板
+關(guān)注
關(guān)注
7文章
6086瀏覽量
35641
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
芯盛智能榮獲2024年信息技術(shù)應(yīng)用創(chuàng)新工作委員會(huì)卓越貢獻(xiàn)成員單位
基于QT開發(fā)國產(chǎn)主板終端桌面程序 高效、穩(wěn)定、跨平臺(tái)的解決方案
飛騰助力首屆教育信息技術(shù)應(yīng)用創(chuàng)新大賽圓滿落幕
有方科技參編的信息技術(shù)團(tuán)體標(biāo)準(zhǔn)發(fā)布
龍芯中科助力2024首屆教育信息技術(shù)應(yīng)用創(chuàng)新大賽成功舉辦
中科創(chuàng)達(dá)榮獲2024年軟件和信息技術(shù)服務(wù)優(yōu)秀企業(yè)
用國產(chǎn)化硬件守護(hù)信息安全,飛騰D2000網(wǎng)絡(luò)安全主板應(yīng)用優(yōu)勢(shì)
信創(chuàng)國產(chǎn)化背景下的工控主板發(fā)展現(xiàn)狀
Linux網(wǎng)絡(luò)協(xié)議棧的實(shí)現(xiàn)
![<b class='flag-5'>Linux</b><b class='flag-5'>網(wǎng)絡(luò)</b>協(xié)議棧的實(shí)現(xiàn)](https://file1.elecfans.com/web2/M00/06/C6/wKgaombfpT-AeVQcAACjr17dpiQ190.png)
梯度科技入選2023年信息技術(shù)應(yīng)用創(chuàng)新解決方案名單
在嵌入式系統(tǒng)中集成Rust和Qt的實(shí)踐
![在嵌入式系統(tǒng)中集成Rust和<b class='flag-5'>Qt</b>的實(shí)踐](https://file1.elecfans.com/web2/M00/D1/7A/wKgZomYjJ9GAVCZLAAKcgD1p9mk410.png)
Linux是做什么用的?
FPGA板子可以跑Qt應(yīng)用程序嗎
Qt上位機(jī)開發(fā)實(shí)戰(zhàn)案例
![<b class='flag-5'>Qt</b>上位機(jī)開發(fā)實(shí)戰(zhàn)案例](https://file1.elecfans.com/web2/M00/C5/0A/wKgaomXxLHqAKhv-AAAVhafIeck465.png)
RX78M組 EtherCAT ETG.5003示例程序固件信息技術(shù)
![RX78M組 EtherCAT ETG.5003示例<b class='flag-5'>程序</b>固件<b class='flag-5'>信息技術(shù)</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評(píng)論