Qt + TCP通信过程 + 客户端与服务端软件的制作


Qt的通信过程如下图:

 

工程目录:

在工程目录中clientwidget类的添加过程,点击工程名字右键添加文件 如下:

                                 

                                        1

              

                                    2

                

                                      3

                  

                                          4

Tcp.pro:

#-------------------------------------------------
#
# Project created by QtCreator 2019-07-07T08:28:26
#
#-------------------------------------------------

QT       += core gui  network

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = Tcp
TEMPLATE = app


SOURCES += main.cpp\
        serverwidget.cpp \
    clientwidget.cpp

HEADERS  += serverwidget.h \
    clientwidget.h

FORMS    += serverwidget.ui \
    clientwidget.ui

CONFIG += C++11

 

 

clientwidget.h:

#ifndef CLIENTWIDGET_H
#define CLIENTWIDGET_H

#include <QWidget>

#include <QTcpSocket>//仅需通信套接字

namespace Ui {
class ClientWidget;
}

class ClientWidget : public QWidget
{
    Q_OBJECT

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

private slots:
    void on_buttonConnect_clicked();

    void on_buttonSend_clicked();

    void on_buttonClose_clicked();
    
private:
    Ui::ClientWidget *ui;

    QTcpSocket  *tcpSocket;//通信套接字
};

#endif // CLIENTWIDGET_H

 

 

serverwidget.h:

#ifndef SERVERWIDGET_H
#define SERVERWIDGET_H

#include <QWidget>

//服务器需要两个套接字
#include <QTcpServer>//监听套接字
#include <QTcpSocket>//通信套接字
namespace Ui {
class ServerWidget;
}

class ServerWidget : public QWidget
{
    Q_OBJECT

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

private slots:
    void on_buttonSend_clicked();

    void on_buttonClose_clicked();

private:
    Ui::ServerWidget *ui;

    //使用指针或者变量都是可以的,不过使用指针的话,需要动态的分配空间,(这里使用指针,锻炼一下)
    QTcpServer  *tcpServer;//监听套接字
    QTcpSocket  *tcpSocket;//通信套接字

};

#endif // SERVERWIDGET_H

 

 

clientwidget.cpp:

#include "clientwidget.h"
#include "ui_clientwidget.h"
#include <QHostAddress>
ClientWidget::ClientWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::ClientWidget)
{
    ui->setupUi(this);

    tcpSocket = NULL;

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


    connect(tcpSocket,&QTcpSocket::connected,[=](){

        ui->textEditRead->setText("成功和服务器建立好连接");

    });

    connect(tcpSocket,&QTcpSocket::readyRead,[=](){
        //获取对方发送的内容
        QByteArray array = tcpSocket->readAll();

        //追加到编辑区中
        ui->textEditRead->append(array);

    });

}

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

void ClientWidget::on_buttonConnect_clicked()
{
    //获取服务器的ip和端口
    QString ip = ui->lineEditIP->text();
    qint16 port = ui->lineEditPort->text().toInt();

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

}



void ClientWidget::on_buttonSend_clicked()
{
    //获取编辑区的内容
    QString str = ui->textEditWrite->toPlainText();

    //发送数据,使用套接字是tcpSocket
    tcpSocket->write(str.toUtf8().data());
}

void ClientWidget::on_buttonClose_clicked()
{
    if(NULL == tcpSocket)
    {
        return ;
    }
    //主动和客户端端口断开连接
    tcpSocket->disconnectFromHost();
    tcpSocket->close();

    tcpSocket = NULL;
}

 

 

main.cpp:

#include "serverwidget.h"
#include <QApplication>
#include "clientwidget.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    ServerWidget w;
    w.show();

//添加的新窗口
    ClientWidget w2;
    w2.show();

    return a.exec();
}

 

 

serverwidget.cpp:

#include "serverwidget.h"
#include "ui_serverwidget.h"

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

    tcpServer = NULL;
    tcpSocket = NULL;

    //监听套接字   指定父对象的目的,让其自动回收空间
    tcpServer = new QTcpServer(this);

    tcpServer->listen(QHostAddress::Any,8888);

    setWindowTitle("服务器:8888");

    connect(tcpServer,&QTcpServer::newConnection,[=](){
        //取出建立好连接的的套接字
        tcpSocket = tcpServer->nextPendingConnection();

        //获取对方的IP和端口
        QString ip = tcpSocket->peerAddress().toString();
        qint16  port = tcpSocket->peerPort();
        QString temp = QString("[%1:%2]:成功连接").arg(ip).arg(port);

        ui->textEditRead->setText(temp);

            /*注意这里的connect的位置,一定在建立好连接后,
             * 不然会出现野指针的错误,前面定义的QTcpSocket  *tcpSocket;
             * 而程序会先从构造函数执行的,还没有执行到定义的QTcpSocket  *tcpSocket指针。
            */
            connect(tcpSocket,&QTcpSocket::readyRead,[=](){

                //从通信套接字中取出内容
                QByteArray array = tcpSocket->readAll();

                ui->textEditRead->append(array);
            });

        });

}

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


void ServerWidget::on_buttonSend_clicked()
{
    if(NULL == tcpSocket)
    {
        return ;
    }
    //获取编辑区的内容
    QString str = ui->textEditWrite->toPlainText();

    //给对方发送数据,使用套接字是tcpSocket
    tcpSocket->write(str.toUtf8().data());

}

void ServerWidget::on_buttonClose_clicked()
{
    if(NULL == tcpSocket)
    {
        return ;
    }
    //主动和客户端端口断开连接
    tcpSocket->disconnectFromHost();
    tcpSocket->close();

    tcpSocket = NULL;
}

 

 

clientwidget.ui:

serverwidget.ui:

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM