基于Qt的Tcp简单通信示意图及代码实现

通信示意图

一、ui设计
  • 服务器端

所用控件类型以及对象名如图所示,最好修改默认的命名以便于区别,在设置textEditRead时可以将它设置为readOnly

  • 客户端

所用控件类型以及对象名如图所示,最好修改默认的命名以便于区别,在设置textEditRead时可以将它设置为readOnly

二、代码设计

两个窗口创建好之后,记得在.pro文件中添加network,即QT += core gui network,这样才能使用QTcpServer和QTcpSocket。

  • 服务器端

    1.在serverwidget.h包含库,创建Server和Socket指针

    #include<QTcpServer>
    #include<QTcpSocket>
    ...
    ...
    private:
        Ui::ServerWidget *ui;
        QTcpServer *tcpServer;
        QTcpSocket *tcpSocket;
    

    2.serverwidget.cpp中代码

    #include "serverwidget.h"
    #include "ui_serverwidget.h"
    
    ServerWidget::ServerWidget(QWidget *parent)
        : QWidget(parent)
        , ui(new Ui::ServerWidget)
    {
        ui->setupUi(this);
    
        setWindowTitle("服务器:8888");
        tcpServer=NULL;
        tcpSocket=NULL;
        tcpServer = new QTcpServer(this);
        tcpServer->listen(QHostAddress::Any,8888);
    
        connect(tcpServer,&QTcpServer::newConnection,[=](){
            tcpSocket=tcpServer->nextPendingConnection();
            QString ip = tcpSocket->peerAddress().toString();
            qint16 port = tcpSocket->peerPort();
    
            QString str=QString("[%1:%2]:连接成功").arg(ip).arg(port);
            ui->textEditRead->setText(str);
    
            connect(tcpSocket,&QTcpSocket::readyRead,[=](){
                QByteArray arr =tcpSocket->readAll();
                ui->textEditRead->append(arr);
            });
    
    
        });
    }
    
    ServerWidget::~ServerWidget()
    {
        delete ui;
    }
    
    
    void ServerWidget::on_buttonSend_clicked()
    {
        if(tcpSocket==NULL)
        {
            return;
        }
        QString str=ui->textEditWrite->toPlainText();
        tcpSocket->write(str.toUtf8().data());
        ui->textEditWrite->clear();
    }
    
    void ServerWidget::on_buttonClose_clicked()
    {
        if(tcpSocket==NULL)
            return;
        tcpSocket->disconnectFromHost();
        tcpSocket->close();
        tcpSocket=NULL;
    }
    

  • 客户端

    1.在clientwidget.h包含库,创建Socket指针

    #include <QTcpSocket>
    ...
    ...
    private:
        Ui::ClientWidget *ui;
        QTcpSocket *tcpSocket;
    

    2.在clientwidget.cpp的代码

    #include "clientwidget.h"
    #include "ui_clientwidget.h"
    #include<QHostAddress>
    ClientWidget::ClientWidget(QWidget *parent) :
        QWidget(parent),
        ui(new Ui::ClientWidget)
    {
        ui->setupUi(this);
        setWindowTitle("客户端");
        tcpSocket=NULL;
        tcpSocket=new QTcpSocket(this);
        connect(tcpSocket,&QTcpSocket::connected,[=](){
            ui->textEditRead->setText(QString("连接服务器成功!"));
        });
    
        connect(tcpSocket,&QTcpSocket::readyRead,[=](){
            QByteArray arr= tcpSocket->readAll();
            ui->textEditRead->append(arr);
        });
    }
    
    ClientWidget::~ClientWidget()
    {
        delete ui;
    }
    
    void ClientWidget::on_buttonConnect_clicked()
    {
    
        qint16 port=ui->lineEdit->text().toInt();
        QString ip = ui->lineEdit_2->text();
        tcpSocket->connectToHost(QHostAddress(ip),port);
    }
    
    void ClientWidget::on_buttonSend_clicked()
    {
        if(!tcpSocket->isOpen())
            return;
        QString str=ui->textEditWrite->toPlainText();
        tcpSocket->write(str.toUtf8().data());
        ui->textEditWrite->clear();
    }
    
    void ClientWidget::on_buttonClose_clicked()
    {
        if(!tcpSocket->isOpen())
            return;
        tcpSocket->disconnectFromHost();
        tcpSocket->close();
    }
    
    
三、成品效果图演示
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值