国庆放假作业5

1、qt实现TCP服务器和客户端

(1)服务器

头文件

复制代码
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTcpServer>
#include <QTcpSocket>
#include <QList>
#include <QMessageBox>
#include <QDebug>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:

    void on_pushButton_clicked();
    //自定义槽函数申明
    void newConnection_slot();

    //处理readyRead信号对应的槽函数
    void readyRead_solt();

private:
    Ui::MainWindow *ui;

    //定义服务器指针
    QTcpServer *server;

    //定义客户端容器
    QList<QTcpSocket *> clientList;

};
#endif // MAINWINDOW_H

源文件

复制代码
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //实例化一个服务器
    server = new QTcpServer(this);

    connect(server,&QTcpServer::newConnection,this,&MainWindow::newConnection_slot);
}

MainWindow::~MainWindow()
{
    delete ui;
}

//启动服务器按钮对应的槽函数
void MainWindow::on_pushButton_clicked()
{
    quint16 port = ui->lineEdit->text().toUInt();
    //监听客户端的连接请求
    if(!server->listen(QHostAddress::Any,port))
    {
        QMessageBox::information(this,"失败","监听失败");
        return ;
    }
    else
    {
        QMessageBox::information(this,"成功","服务器启动成功");
    }


}

//自定义槽函数
void MainWindow::newConnection_slot()
{
    qDebug()<<"你有新的客户端发来请求";

    //获取最新连接的客户端
    QTcpSocket *s = server->nextPendingConnection();

    //将套接字放入客户端链表中
    clientList.push_back(s);

    //此时如果有客户端向服务器发来数据,那么对应的客户端套接字就会自动发射一个readyRead信号
    //我们可以将该信号
    connect(s,&QTcpSocket::readyRead,this,&MainWindow::readyRead_solt);
}

//readyRead信号槽函数的实现
void MainWindow::readyRead_solt()
{
    qDebug()<<"有新的客户端消息发来了";

    //遍历客户端链表将无效的客户端移除清理
    for(int i=0;i<clientList.size();i++)
    {
        //判断当前套接字是否是有效连接
        if(clientList[i]->state()==0)  //此时为无效
        {
            //将该套接字移除客户端容器
            clientList.removeAt(i);
        }
    }
    //遍历客户端链表,判断是哪个客户端连接
    for(int i=0;i<clientList.size();i++)
    {
        //函数原型
        //功能:求当前客户端套接字中待读数据的套接字
        if(clientList[i]->bytesAvailable()!=0)
        {
            //将套接字中的数据读取出来
            QByteArray msg = clientList[i]->readAll();

            //将数据展示到ui界面
            ui->listWidget->addItem(QString::fromLocal8Bit(msg));

            //将接收到的数据,转发给所有客户端
            for(int j=0;j<clientList.size();j++)
            {
                clientList[j]->write(msg);
            }
        }
    }
}

主函数

复制代码
#include "mainwindow.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

(2)客户端

头文件

复制代码
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTcpSocket>  //客户端类
#include <QMessageBox>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_pushButton_2_clicked();

    //自定义信号处理槽函数
    void connected_solt();

    //自定义数据信号处理槽函数
    void readyRead_solt();

    void disconnected_solt();

    void on_pushButton_clicked();

    void on_pushButton_3_clicked();

private:
    Ui::MainWindow *ui;

    //定义客户端指针
    QTcpSocket *socket;

    //定义字符串接收用户
    QString username;
};
#endif // MAINWINDOW_H

源文件

复制代码
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //给客户端指针实例化对象
    socket = new QTcpSocket(this);

    connect(socket,&QTcpSocket::connected,this,&MainWindow::connected_solt);

    //如果服务器向客户端发来消息
    //我们可以将该信号连接到自定义的槽函数中
    connect(socket,&QTcpSocket::readyRead,this,&MainWindow::readyRead_solt);

    connect(socket,&QTcpSocket::disconnected,this,&MainWindow::disconnected_solt);
}

MainWindow::~MainWindow()
{
    delete ui;
}

//连接服务器按钮槽函数
void MainWindow::on_pushButton_2_clicked()
{
    //获取ui界面上的相关信息
    username = ui->lineEdit_4->text();
    QString ip = ui->lineEdit_2->text();
    quint16 port = ui->lineEdit_3->text().toUInt();

    //功能:将客户端连接到给定的服务器
    socket->connectToHost(ip,port);
}

//处理信号槽函数
void MainWindow::connected_solt()
{
    QMessageBox::information(this,"成功","你已经成功进入聊天室");

    //向服务器发送一条数据
    QString msg = username +":进入聊天室";

    socket->write(msg.toLocal8Bit());  //将数据写给服务器
}

//处理readyRead信号的槽函数定义
void MainWindow::readyRead_solt()
{
    //读取套接字中的信息
    QByteArray msg = socket->readAll();

    //将文字内容美国展示到ui界面
    ui->listWidget->addItem(QString::fromLocal8Bit(msg));
}

//发送按钮对应的槽函数
void MainWindow::on_pushButton_clicked()
{
    //获取ui界面输入的内容
    QString msg = username+": "+ ui->lineEdit->text();

    //发送给服务器
    socket->write(msg.toLocal8Bit());

    //清空编辑框内容
    ui->lineEdit->clear();
}

//断开服务器对应按钮槽函数
void MainWindow::on_pushButton_3_clicked()
{
    //告诉大家我走了
    QString msg = username+": 离开聊天室";
    socket->write(msg.toLocal8Bit());

    //断开连接
    socket->disconnectFromHost();

}

void MainWindow::disconnected_solt()
{
    QMessageBox::information(this,"提示","退出成功");
}

主函数

复制代码
#include "mainwindow.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}
相关推荐
邵老师讲教育7 小时前
2026年实测:4大宁波周末数学小升初源头服务商横向评测
其他
Mxzx品牌1 天前
佛山招聘软件哪个好:【帅聘网】匹配度高
笔记·其他·生活
575771 天前
净水器怎么选才实惠:过滤精度、流速、总净水量和认证四步核账法
其他
执欣之手1 天前
Hmcke Tugam
其他
深圳帝王星科技2 天前
SE8408 Sync Buck 100V 30A
其他
北京海得康2 天前
瑞拉可兰 (Relacorilant) 不良反应、安全警戒要点与临床安全
其他
智慧大脑搬运工2 天前
环保绩效A级B级评定标准与绿色制造准入机制研究——基于山东省2025—2026年政策框架分析
其他
cellurw3 天前
20260803 LA Vendor与CDSP修复及BP模块实测
其他
2601_962101834 天前
广告灯箱导光板材料对比:PMMA vs PC vs PETG,亮欣如何用光学级PMMA实现高亮低故障?
其他
执欣之手4 天前
Hullnky Taper
其他