一、手動完成服務(wù)器的實現(xiàn),并注釋具體步驟
源碼:
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QTcpServer> //服務(wù)器類
#include <QTcpSocket> //客戶端類
#include <QMessageBox> //對話框類
#include <QList> //鏈表容器
#include <QDebug> //信息調(diào)試類
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
void newConnnecttion_slot(); //自定義槽函數(shù),用來處理有客戶端發(fā)送連接請求后,服務(wù)器自動發(fā)送的newConnecttion信號
void readyRead_slot(); //自定義槽函數(shù),用來處理客戶端要向客戶端發(fā)送信息時,客戶端自動發(fā)送的readyRead信號
private slots:
void on_pushButton_clicked();
private:
Ui::Widget *ui;
//定義服務(wù)器指針
QTcpServer *server;
//定義存儲客戶端套接字容器
QList<QTcpSocket*> sockList;
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//實例化一個服務(wù)器對象
server = new QTcpServer(this);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_pushButton_clicked()
{
//將行編輯器的內(nèi)容賦值到port中
quint16 port = ui->lineEdit->text().toUInt();
//監(jiān)聽
if(server->listen(QHostAddress::Any, port)){
QMessageBox::information(this, "連接提示", "客戶端連接成功!");
}else{
QMessageBox::information(this, "連接提示", "客戶端連接失敗!");
}
//此時服務(wù)器已經(jīng)處于監(jiān)聽狀態(tài),如果有客戶端發(fā)送連接請求,那么該服務(wù)器會自動發(fā)送newConnnecttion信號
//我們可以將該信號連接到自定義的槽函數(shù)中,處理新套接字
connect(server, &QTcpServer::newConnection, this, &Widget::newConnnecttion_slot);
}
void Widget::newConnnecttion_slot()
{
//保存服務(wù)器接收到的客戶端套接字指針
QTcpSocket *s = server->nextPendingConnection();
//將該套接字指針放到容器中
sockList.push_back(s);
//此時服務(wù)器與客戶端已建立連接
//如果客戶端要向服務(wù)器發(fā)送信息,那么會發(fā)送一個readyRead信號
//此時需要將該信號與自定義槽函數(shù)連接,讀取客戶端數(shù)據(jù)
connect(s, &QTcpSocket::readyRead, this, &Widget::readyRead_slot);
}
void Widget::readyRead_slot(){
//移除無效客戶端
for(int i = 0; i < sockList.count(); i++){ //sockList.count() 表示存儲客戶端套接字的容器內(nèi)元素個數(shù)
if(sockList.at(i)->state() == 0){ //state表示客戶端的狀態(tài),是一個枚舉值,=0表示該客戶端已斷開連接
sockList.removeAt(i); //移除該客戶端
}
}
//遍歷客戶端容器,判斷是哪個客戶端有數(shù)據(jù)要讀
for(int i = 0; i < sockList.count(); i++){
if(sockList.at(i)->bytesAvailable() != 0){ //表示該客戶端有數(shù)據(jù)要讀
//讀取該客戶端發(fā)送的全部信息
QByteArray msg = sockList.at(i)->readAll();
//將數(shù)據(jù)展示到ui界面
ui->listWidget->addItem(QString::fromLocal8Bit(msg));
//將該消息發(fā)送給所有客戶端
for(int i = 0; i < sockList.count(); i++){
sockList.at(i)->write(msg);
}
}
}
}
main.cpp文章來源:http://www.zghlxwxcb.cn/news/detail-619411.html
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
二、思維導(dǎo)圖
文章來源地址http://www.zghlxwxcb.cn/news/detail-619411.html
到了這里,關(guān)于嵌入式:QT Day4的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!