1.Qt中實現(xiàn)服務(wù)器的原理;
---chatser.h---頭文件
#ifndef CHATSER_H
#define CHATSER_H
#include <QWidget>
#include <QTcpServer> //服務(wù)器類
#include <QTcpSocket> //套接字類
#include <QMessageBox> //消息對話類
#include <QList> //鏈表容器
#include <QDebug> //信息調(diào)試類
QT_BEGIN_NAMESPACE
namespace Ui { class Chatser; }
QT_END_NAMESPACE
class Chatser : public QWidget
{
Q_OBJECT
public:
Chatser(QWidget *parent = nullptr);
~Chatser();
private slots:
void on_start_btn_clicked(); //啟動服務(wù)器按鈕槽函數(shù)
void newConnection_slot(); //處理cli連接信號槽
void readyRead_slot(); //處理cli發(fā)送數(shù)據(jù)信號槽
private:
Ui::Chatser *ui;
QTcpServer *server; //定義服務(wù)器指針
QList<QTcpSocket*> socketList; //定義客戶端容器
};
#endif // CHATSER_H
---chatser.cpp---函數(shù)實現(xiàn)文件
#include "chatser.h"
#include "ui_chatser.h"
Chatser::Chatser(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Chatser)
{
ui->setupUi(this);
server = new QTcpServer(this); //給服務(wù)器指針實例化空間
}
Chatser::~Chatser()
{
delete ui;
}
//啟動服務(wù)器按鈕槽函數(shù)
void Chatser::on_start_btn_clicked()
{
//獲取ui界面上的端口號
quint16 port = ui->port_edit->text().toUInt();
//將服務(wù)器設(shè)為監(jiān)聽狀態(tài)
if(server->listen(QHostAddress::Any,port))
{
QMessageBox::information(this,"listen","服務(wù)器啟動成功");
}else
{
QMessageBox::information(this,"listen","服務(wù)器啟動失敗");
}
//如果有客戶端發(fā)來連接請求,那么該服務(wù)器就會自動發(fā)射一個newConnection信號
//將客戶端連接信號與對應(yīng)槽函數(shù)連接
connect(server,&QTcpServer::newConnection,this,&Chatser::newConnection_slot);
}
//處理cli連接信號槽
void Chatser::newConnection_slot()
{
qDebug()<<"有新客戶端連接";
//獲取最新連接的客戶端套接字
QTcpSocket *s = server->nextPendingConnection();
//將套接字放入客戶端容器中
socketList.push_back(s);
//如果有客戶端向服務(wù)器發(fā)來數(shù)據(jù),那么該客戶端會自動發(fā)射一個readyRead信號
//將客戶端發(fā)送數(shù)據(jù)信號與對應(yīng)槽函數(shù)連接
connect(s,&QTcpSocket::readyRead,this,&Chatser::readyRead_slot);
}
//處理cli發(fā)送數(shù)據(jù)信號槽
void Chatser::readyRead_slot()
{
//移除無效客戶端
for(int i=0; i<socketList.count(); i++)
{
if(socketList.at(i)->state() == 0) //state函數(shù)返回值為枚舉值,
{ //0表示無效連接
socketList.removeAt(i);
}
}
//遍歷客戶端套接字,尋找哪個客戶端有數(shù)據(jù)待讀
for(int i=0; i<socketList.count(); i++)
{
if(socketList.at(i)->bytesAvailable() != 0)
{
//讀取數(shù)據(jù)
QByteArray msg = socketList.at(i)->readAll();
//將數(shù)據(jù)展示到ui界面
ui->msg_Widget->addItem(QString::fromLocal8Bit(msg));
//將數(shù)據(jù)發(fā)送給所有的客戶端
for(int j=0; j<socketList.count(); j++)
{
socketList.at(j)->write(msg);
}
}
}
}
---main.cpp---測試文件
#include "chatser.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Chatser w;
w.show();
return a.exec();
}
結(jié)果展示---?
?文章來源地址http://www.zghlxwxcb.cn/news/detail-613703.html
2.今日思維導(dǎo)圖;
文章來源:http://www.zghlxwxcb.cn/news/detail-613703.html
?
到了這里,關(guān)于DAY4,Qt(事件處理機制的使用,Qt中實現(xiàn)服務(wù)器的原理)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!