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

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

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

成品效果图:

 

 

 

主要源码:

//********************************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();
}

 

 

 







 

 

 

 

================================================
下载链接:
Qt5/C++:TCP的C/S的聊天小程序【GUI】

成品以及如何将其发布的教程(任何Win环境均可以直接运行)的视频附带

 

 

 

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

 

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

 

 

 

系列地址:

QtExamples

欢迎 starfork 这个系列的 QT / DTK 学习,附学习由浅入深的目录。

 

  • 5
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

偕臧x

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值