欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

项目实战:Qt5/C++:TCP的C/S的聊天小程序

程序员文章站 2024-01-17 18:11:28
...

项目实战:Qt5/C++:TCP的C/S的聊天小程序: 开源之美

----------编译环境:Win10专业版x64    QtCreate5.8----------

成品效果图:
项目实战:Qt5/C++:TCP的C/S的聊天小程序


主要源码:

//********************************TcpClient*********************************

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTcpSocket>  //通信套接字

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private slots:
    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

    void on_pushButton_3_clicked();

private:
    Ui::Widget *ui;
    QTcpSocket *pTcpSocket;
};

#endif // WIDGET_H

#include "widget.h"
#include "ui_widget.h"
#include <QHostAddress>

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

    this->setWindowTitle("TcpClient");

    pTcpSocket = NULL;

    //分配空间,指定父对象
    pTcpSocket = new QTcpSocket(this);

    //弹出来一个提示而已
    connect(pTcpSocket, &QTcpSocket::connected,
            [=]()
           {
               ui->textEditRead->setText("The connection server is successful.");
           }
           );

    //显示来自服务器的消息
    connect(pTcpSocket, &QTcpSocket::readyRead,
            [=]()
           {
               //从通信套接字中间取出内容
               QByteArray array = pTcpSocket->readAll();
               //QString temp2 = QString("");
               ui->textEditRead->append("[Server:]" + array); //在后面追加新的消息
           }
           );


    connect(ui->pushButton_2, &QPushButton::pressed,
           [=]()
           {
              QString str = "[Client:]" + ui->textEditWrite->toPlainText();
              ui->textEditRead->append(str); //在后面追加新的消息
           }
           );


}

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


//与服务器建立连接
void Widget::on_pushButton_clicked()
{
    //获得服务器的IP和端口
    QString ip = ui->lineEdit->text();
    qint16 port = ui->lineEdit_2->text().toInt();

    //主动和服务器将建立连接
    pTcpSocket->connectToHost(QHostAddress(ip), port);
}


//给服务器发送消息
void Widget::on_pushButton_2_clicked()
{
    //获取编辑区域的内容
    QString str = ui->textEditWrite->toPlainText();
    //给对方发送消息,当有中文的时候就是用使用utf8
    pTcpSocket->write(str.toUtf8().data());
}


//断开连接
void Widget::on_pushButton_3_clicked()
{
    pTcpSocket->disconnectFromHost();
}
//********************************TcpServer*********************************

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTcpServer>  //监听套接字
#include <QTcpSocket>  //通信套接字



namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private slots:
    void on_pushButtonSend_clicked();

    void on_pushButtonClose_clicked();

private:
    Ui::Widget *ui;

    QTcpServer *pTcpServer;
    QTcpSocket *pTcpSocket;
};

#endif // WIDGET_H



#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>

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

    //避免一开始用户点击Send按钮,结果程序会无法正常运行
    pTcpServer = NULL;
    pTcpSocket = NULL;


    //指定父对象,让其自动回收该区域的空间
    pTcpServer = new QTcpServer(this);

    //绑定当前网卡的所有IP,和监听的端口
    pTcpServer->listen(QHostAddress::Any, 8888);

    //只要一建立连接成功,就会自动触发newConnection函数
    connect(pTcpServer, &QTcpServer::newConnection,
            [=]()
            {
                //取出建立好的连接套接字
                pTcpSocket = pTcpServer->nextPendingConnection();

                //获得客户端的IP和端口
                QString ip = pTcpSocket->peerAddress().toString();
                qint16 port = pTcpSocket->peerPort();
                QString temp = QString("[%1:%2]:The client connection is successful.").arg(ip).arg(port);

                ui->textEditRead->setText(temp);


                //-----------------------------------------------------------------------------------------------
                //接收到了内容之后,直接在显示区域显示消息
                /**/ connect(pTcpSocket, &QTcpSocket::readyRead,
                /**/        [=]()
                /**/        {
                /**/           //从通信套接字中间取出内容
                /**/           QByteArray array = pTcpSocket->readAll();
                /**/           //QString temp2 = QString("");
                /**/           ui->textEditRead->append("[Client:]" + array); //在后面追加新的消息
                /**/        }
                /**/        );
                //-----------------------------------------------------------------------------------------------
            }
            );

    connect(ui->pushButtonSend, &QPushButton::pressed,
           [=]()
           {
              QString str = "[Server:]" + ui->textEditWrite->toPlainText();
              ui->textEditRead->append(str); //在后面追加新的消息
           }
           );

    this->setWindowTitle("TcpServer");


}

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

//给客户端发送消息的功能
void Widget::on_pushButtonSend_clicked()
{
    //获取编辑区域的内容
    QString str = ui->textEditWrite->toPlainText();
    //给对方发送消息,当有中文的时候就是用使用utf8
    pTcpSocket->write(str.toUtf8().data());
}

//断开连接,拒绝接受来自客户端的消息
void Widget::on_pushButtonClose_clicked()
{
    pTcpSocket->disconnectFromHost();
    pTcpSocket->close();
}















源码链接:https://pan.baidu.com/s/1jIY6JKM 密码:3ynq

成品以及如何将其发布的教程(任何Win环境均可以直接运行)的视频链接:https://pan.baidu.com/s/1o9RTpEi 密码:be82



我的博客里面应该还有一篇纯C语言写的控制台模式的Tcp的基于C/S模式的通信。欢迎大家参考。

其他:以后会不定期续写的,且上面得源码都是自己学习过程的一个又一个脚印,希望也可以给你们一些启发,也给自己一个回忆,么么哒φ(>ω<*)