码迷,mamicode.com
首页 > 编程语言 > 详细

关于QT上的TCP通信的实现(对比与VS 上C++的实现方式)

时间:2020-01-25 15:36:45      阅读:119      评论:0      收藏:0      [点我收藏+]

标签:函数   amp   delete   close   使用   pre   ++   soc   ctf   

  上一个blog说了C++的实现方法,但是大黑框的显示未免显得有点太过于不美观,此次具体采用QT的方式进行实现,大致上的流程是这样的:技术图片

参考上面的流程图,大致上的实现模式就是这样,但是TCP通信的全双工的形式,所以收发信息的操作对客户端还是服务端而言都i是一样的,所以我们看看代码的实现模式:

首先是TCP的实现

1.先创建这样

技术图片

 

然后一路往下点击下一步:

需要注意的是在这里我们选择这个:
技术图片

 

接着看看代码:serverWidget.h

#ifndef SERVERWIDGET_H
#define SERVERWIDGET_H

#include <QWidget>
#include<QTcpServer>//监听套接字
#include<QTcpSocket>//通信套接字
QT_BEGIN_NAMESPACE
namespace Ui { class serverWidget; }
QT_END_NAMESPACE

class serverWidget : public QWidget
{
    Q_OBJECT

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

private slots:
    void on_pushButton_read_clicked();

    void on_pushButton_write_clicked();

    void on_pushButton_close_clicked();

private:
    Ui::serverWidget *ui;
    QTcpServer *server;
    QTcpSocket *socket_ser;
};
#endif // SERVERWIDGET_H

serverWidget.cpp

#include "serverwidget.h"
#include "ui_serverwidget.h"
#include<QDebug>
#include<QtNetwork>
serverWidget::serverWidget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::serverWidget)
{
    server=new QTcpServer(this);
    ui->setupUi(this);
    bool isok=server->listen(QHostAddress::Any,8888);//在QT中绑定和监听都使用的是listen函数
    if(isok)
    {
        QString str1="监听成功。。。。。";
        ui->textEdit_read->setText(str1);
        //等待来自客户端的链接触发一个事件Connect action
        connect(server,&QTcpServer::newConnection,
                [=]()
        {
            //配置上通信套接字
            socket_ser=server->nextPendingConnection();
            //获得对方的端口和IP
            QString ip=socket_ser->peerAddress().toString();
             qint16 port  =socket_ser->peerPort();
             ui->textEdit_read->setText(QString("端口是%1,ip地址是%2").arg(port).arg(ip));
             //读的时候会触发一个信号readyRead().
             connect(socket_ser,&QTcpSocket::readyRead,
                     [=](){
                 //从通信的套接字中拿出内容
                 QByteArray array=socket_ser->readAll();
                 ui->textEdit_read->append(array);
             }
                     );

        }


                );
    }
    else
    {
       ui->textEdit_read->setText(QString("监听失败。。。。。"));
    }
}

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




void serverWidget::on_pushButton_write_clicked()
{
    QString str=ui->textEdit_write->toPlainText();
    socket_ser->write(str.toUtf8().data());
}

void serverWidget::on_pushButton_close_clicked()
{
    //进行套接字的关闭
    socket_ser->disconnectFromHost();//通信套接字主动和端口断开链接
    server->close();
}

UI的设置是这样的:

技术图片

 

 客户端的UI也是这样的设置

2.下面看看服务器的代码

clientWidget.h

#ifndef CLIENTWIDGET_H
#define CLIENTWIDGET_H

#include <QWidget>
#include<QTcpSocket>
QT_BEGIN_NAMESPACE
namespace Ui { class clientWidget; }
QT_END_NAMESPACE

class clientWidget : public QWidget
{
    Q_OBJECT

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

private slots:
    void on_pushButton_write_clicked();

    void on_pushButton_close_clicked();

private:
    Ui::clientWidget *ui;
   QTcpSocket *socket_client;
};
#endif // CLIENTWIDGET_H

clientWidget.cpp

#include "clientwidget.h"
#include "ui_clientwidget.h"
#include<QtNetwork>
clientWidget::clientWidget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::clientWidget)
{
    ui->setupUi(this);
    socket_client=new QTcpSocket(this);
    socket_client->connectToHost("127.0.0.1",8888);
    //关于客户端的读取,客户端本身就是一个通信套接字的形式进行信息的收发
    connect(socket_client,&QTcpSocket::readyRead,
            [=](){
         QByteArray array= socket_client->readAll();
         ui->textEdit_read->append(array);
    });
}

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


void clientWidget::on_pushButton_write_clicked()
{
    QString mystring=ui->textEdit_write->toPlainText();
    socket_client->write(mystring.toUtf8().data());
}

void clientWidget::on_pushButton_close_clicked()
{
    socket_client->disconnectFromHost();
}

【remark】

通过和上一个C++版本的对比,显然可以看出QT的版本比较简单容易实现,但是值得注意的是要在pro的文件里面加上“QT += network”,并且在CPP文件中加上

#include<QtNetwork>
详细的运行结果如下:

技术图片

 

关于QT上的TCP通信的实现(对比与VS 上C++的实现方式)

标签:函数   amp   delete   close   使用   pre   ++   soc   ctf   

原文地址:https://www.cnblogs.com/dfxdd/p/12233072.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!