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

版权声明:欢迎个人转载,但是亲请注明转载原文地址,谢谢,么么哒,若用作商业用途,请联系作者授权 https://blog.csdn.net/qq_33154343/article/details/79341062

项目实战: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();
}

 

 

 







 

 

 

 

================================================
下载链接:

https://github.com/touwoyimuli/2018_02_C_CPlus/tree/master/05_qt_TCP带UI的聊天工具

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

 

 

 

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

 

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

 

展开阅读全文

没有更多推荐了,返回首页