QT实现tcp客户端服务器通信

 最终实现效果如上图

服务器端代码

tcpwidget.cpp代码

#include "tcpwidget.h"
#include "ui_tcpwidget.h"

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

    //初始化服务器的对象
    server = new QTcpServer(this);

    //进入监听状态
#if 1
    server->listen(QHostAddress::Any, ui->portEdit->text().toUShort());
#else
    server->listen(QHostAddress(ui->ipEdit->text()), ui->portEdit->text().toUShort());
#endif

    //如果客户端连接后,那么会自动触发newConnection信号,在槽方法里需要接收客户端的链接
    QObject::connect(server, SIGNAL(newConnection()),
                     this,  SLOT(connectSlot()));
}

void TcpWidget::connectSlot()
{
    ui->recvEdit->setText("有新的连接过来");
    //接收客户端的连接
    client = server->nextPendingConnection();

    //客户端一旦发数据,就会触发readyRead信号,那么只需要接到这个信号后,读取内容即可
    QObject::connect(client, SIGNAL(readyRead()),
                     this,  SLOT(readSlot()));
}

void TcpWidget::readSlot()
{
    //业务逻辑
    QByteArray buf = client->readAll();

    //显示到界面上
    QString str = QString::fromLocal8Bit(buf);
    ui->recvEdit->setText(str);
}

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

void TcpWidget::on_pushButton_clicked()
{
    QString str = ui->sendEdit->toPlainText();
    client->write(str.toLocal8Bit());
}

main.cpp

#include "tcpwidget.h"
#include <QApplication>

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

    return a.exec();
}

客户端代码

clientwidget.cpp代码

#include "clientwidget.h"
#include "ui_clientwidget.h"

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

    //1.实例化客户端的对象
    client = new QTcpSocket(this);
}

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

void ClientWidget::on_connectBtn_clicked()
{
    //2.连接到服务器
    client->connectToHost(QHostAddress(ui->ipEdit->text()),\
                          ui->portEdit->text().toUShort());

    if (client->waitForConnected(1000)){
        ui->recvEdit->setText("connect success");
    }else{
        qDebug()<<"connect failed";
    }

    //3.绑定readyread()信号
    QObject::connect(client, SIGNAL(readyRead()),
                     this,  SLOT(readSlot()));
}

/**
 * @brief 把发送框中内容发给服务器
 */
void ClientWidget::on_sendBtn_clicked()
{
    QString buf = ui->sendEdit->text();
    QByteArray sendBuf = buf.toUtf8();

    client->write(sendBuf);
}

/**
 * @brief 读取来自服务器的数据
 */
void ClientWidget::readSlot()
{
    //6.读取数据,显示到界面
    QByteArray buf = client->readAll();
    ui->recvEdit->setText(QString(buf));
}

main.cpp

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

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    ClientWidget w;
    w.show();

    return a.exec();
}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
QT TCP客户端服务器通信的步骤如下: 1. 创建QT TCP客户端对象 使用QT提供的QTcpSocket类创建TCP客户端对象。可以使用new运算符在堆上动态分配内存,也可以在栈上创建对象。 ``` QTcpSocket *client = new QTcpSocket(this); // 动态分配内存 ``` 2. 连接服务器 使用client对象的connectToHost()函数连接服务器。该函数需要传递服务器的IP地址和端口号。 ``` client->connectToHost("127.0.0.1", 8888); // 连接服务器 ``` 3. 发送数据 使用client对象的write()函数发送数据。该函数需要传递待发送的数据和数据长度。 ``` QByteArray data = "Hello World!"; client->write(data, data.length()); // 发送数据 ``` 4. 接收数据 使用client对象的readyRead()信号接收服务器发送的数据。可以使用client对象的read()函数读取接收到的数据。 ``` connect(client, SIGNAL(readyRead()), this, SLOT(readData())); ``` ``` void readData() { QByteArray data = client->readAll(); // 读取数据 qDebug() << data; } ``` 5. 断开连接 使用client对象的disconnectFromHost()函数断开与服务器的连接。 ``` client->disconnectFromHost(); // 断开连接 ``` 完整的QT TCP客户端代码如下: ``` #include <QTcpSocket> class Client : public QObject { Q_OBJECT public: Client(QObject *parent = nullptr); ~Client(); private slots: void readData(); private: QTcpSocket *client; }; Client::Client(QObject *parent) : QObject(parent) { client = new QTcpSocket(this); client->connectToHost("127.0.0.1", 8888); connect(client, SIGNAL(readyRead()), this, SLOT(readData())); } Client::~Client() { client->disconnectFromHost(); } void Client::readData() { QByteArray data = client->readAll(); qDebug() << data; } ``` 注意:QTcpSocket是异步的,因此需要使用信号和槽机制来处理数据接收。同时,需要在客户端对象的析构函数中调用disconnectFromHost()函数断开与服务器的连接。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值