1.Qt中实现服务器的原理;
---chatser.h---头文件
#ifndef CHATSER_H
#define CHATSER_H
#include <QWidget>
#include <QTcpServer> //服务器类
#include <QTcpSocket> //套接字类
#include <QMessageBox> //消息对话类
#include <QList> //链表容器
#include <QDebug> //信息调试类
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(); //启动服务器按钮槽函数
void newConnection_slot(); //处理cli连接信号槽
void readyRead_slot(); //处理cli发送数据信号槽
private:
Ui::Chatser *ui;
QTcpServer *server; //定义服务器指针
QList<QTcpSocket*> socketList; //定义客户端容器
};
#endif // CHATSER_H
---chatser.cpp---函数实现文件
#include "chatser.h"
#include "ui_chatser.h"
Chatser::Chatser(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Chatser)
{
ui->setupUi(this);
server = new QTcpServer(this); //给服务器指针实例化空间
}
Chatser::~Chatser()
{
delete ui;
}
//启动服务器按钮槽函数
void Chatser::on_start_btn_clicked()
{
//获取ui界面上的端口号
quint16 port = ui->port_edit->text().toUInt();
//将服务器设为监听状态
if(server->listen(QHostAddress::Any,port))
{
QMessageBox::information(this,"listen","服务器启动成功");
}else
{
QMessageBox::information(this,"listen","服务器启动失败");
}
//如果有客户端发来连接请求,那么该服务器就会自动发射一个newConnection信号
//将客户端连接信号与对应槽函数连接
connect(server,&QTcpServer::newConnection,this,&Chatser::newConnection_slot);
}
//处理cli连接信号槽
void Chatser::newConnection_slot()
{
qDebug()<<"有新客户端连接";
//获取最新连接的客户端套接字
QTcpSocket *s = server->nextPendingConnection();
//将套接字放入客户端容器中
socketList.push_back(s);
//如果有客户端向服务器发来数据,那么该客户端会自动发射一个readyRead信号
//将客户端发送数据信号与对应槽函数连接
connect(s,&QTcpSocket::readyRead,this,&Chatser::readyRead_slot);
}
//处理cli发送数据信号槽
void Chatser::readyRead_slot()
{
//移除无效客户端
for(int i=0; i<socketList.count(); i++)
{
if(socketList.at(i)->state() == 0) //state函数返回值为枚举值,
{ //0表示无效连接
socketList.removeAt(i);
}
}
//遍历客户端套接字,寻找哪个客户端有数据待读
for(int i=0; i<socketList.count(); i++)
{
if(socketList.at(i)->bytesAvailable() != 0)
{
//读取数据
QByteArray msg = socketList.at(i)->readAll();
//将数据展示到ui界面
ui->msg_Widget->addItem(QString::fromLocal8Bit(msg));
//将数据发送给所有的客户端
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();
}
结果展示---
2.今日思维导图;