【QT学习之路】TCP通信

QT自带了TCP通信模块,只需在工程文件中加入QT += network,就可以添加TCP所需的头文件,下面就来实现通过TCP协议让服务器和客户端之间行通信。

一、服务器的实现

     服务器端 QTcpServer+QTcpSocket

    QTcpServer(创建socket套接字, 绑定, 监听, 接受链接)

    QTcpSocket(创建socket套接字--链接时候创建, 接收数据, 发送数据)

实现流程

1. 创建QTcpServer对象

     QTcpServer mserver;

2. 调用对象方法监听(listen(ip, port))

     mserver.listen(QHostAddress::Anyui->portEdit->text().toUShort());

3.当有客户端连接的时候QTcpServer对象会发送newConnection信号--关联槽函数

     connect(&mserver, &QTcpServer::newConnectionthis, &ServerTcp::new_client);

4.在槽函数中通过QTcpServer对象获取QTcpSocket对象,并给客户端发送连接成功的消息

   void ServerTcp::new_client()

   {

        QTcpSocket *msocket = mserver.nextPendingConnection();//获取与客户端通信的套接字

        //向客户端发送数据

         msocket->write("connect");

   }

5.当客户端有数据到达服务器QTcpSocket对象会发送readyRead信号--关联槽函数

    connect(msocket, &QTcpSocket::readyReadthis, &ServerTcp::read_data);

6.在槽函数中通过QTcpSocket对象读取数据

   void ServerTcp::read_data()

   {

        //获取信号发送者

       QTcpSocket *msocket = dynamic_cast<QTcpSocket*>(sender());

       //读取数据

       QString msg = msocket->readAll();

       //获取对方IP

       QString ip = msocket->peerAddress().toString();

       ui->textBrowser->append(ip+":"+msg);

}

二、客户端的实现

     客户端 QTcpSocket

     QTcpSocket(创建socket套接字,连接服务器, 接收数据, 发送数据)

实现流程

1. 创建QTcpSocket对象

     QTcpSocket msocket;

2. 调用对象方法链接服务器(connectToHost(服务器的IP, 端口))

      msocket.connectToHost(ui->ipEdit->text(), ui->portEdit->text().toUShort());

3. 发送数据

    QString data = ui->textEdit->toPlainText();

    msocket.write(data.toUtf8());

4. 当QTcpSocket有数据可读会发送readyRead信号--关联槽函数

    connect(&msocket, &QTcpSocket::readyReadthis, &ClientTcp::read_data);

5. 在槽函数中读取数据

   void ClientTcp::read_data()

   {

        //读取数据

       QString msg = msocket.readAll();

       ui->textBrowser->append(msg);

   }

三、具体代码

服务器

1、界面设计

2、代码设计

#include "servertcp.h"
#include "ui_servertcp.h"

ServerTcp::ServerTcp(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::ServerTcp)
{
    ui->setupUi(this);
    //关联客户端连接信号
    connect(&mserver, &QTcpServer::newConnection, this, &ServerTcp::new_client);
}

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

void ServerTcp::on_startBt_clicked()
{
    //监听--启动服务器
    mserver.listen(QHostAddress::Any, ui->portEdit->text().toUShort());
}
//槽函数---接受链接--获取与客户端通信的套接字
void ServerTcp::new_client()
{
    QTcpSocket *msocket = mserver.nextPendingConnection();//获取与客户端通信的套接字
    //向客户端发送数据
    msocket->write("connect");
    //关联读数据信号
    connect(msocket, &QTcpSocket::readyRead, this, &ServerTcp::read_data);
}

//槽函数---读取数据
void ServerTcp::read_data()
{
    //获取信号发送者
    QTcpSocket *msocket = dynamic_cast<QTcpSocket*>(sender());
    //读取数据
    QString msg = msocket->readAll();
    //获取对方IP
    QString ip = msocket->peerAddress().toString();
    ip.remove("::ffff:");

    ui->textBrowser->append(ip+":"+msg);
}

客户端

1、界面设计

2、代码设计

#include "clienttcp.h"
#include "ui_clienttcp.h"

ClientTcp::ClientTcp(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::ClientTcp)
{
    ui->setupUi(this);
    //关联读数据信号
    connect(&msocket, &QTcpSocket::readyRead, this, &ClientTcp::read_data);
}

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

void ClientTcp::on_connectBt_clicked()
{
    //链接服务器
    msocket.connectToHost(ui->ipEdit->text(), ui->portEdit->text().toUShort());
}

void ClientTcp::on_sendBt_clicked()
{
    //发送数据
    QString data = ui->textEdit->toPlainText();
    msocket.write(data.toUtf8());
}

void ClientTcp::read_data()
{
    //读取数据
    QString msg = msocket.readAll();
    ui->textBrowser->append(msg);
}

四、实现效果

问题咨询及项目源码请加群:

QQ群

名称:IT项目交流群

群号:245022761

  • 1
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Qt中实现TCP通信,一般可以使用Qt提供的网络库Qt Network来实现。如果需要在应用程序中同时执行网络操作和其他操作,可以将网络操作放在一个独立的线程中执行,这样可以防止网络操作阻塞主线程。 继承QThread类可以方便地创建一个新线程,然后将网络操作放在新线程中执行。以下是一个简单的例子,展示如何使用继承QThread类的方式实现TCP通信: ```c++ #include <QTcpSocket> #include <QThread> class MyThread : public QThread { Q_OBJECT public: MyThread(QObject *parent = nullptr); void run() override; signals: void messageReceived(const QString &msg); private: QTcpSocket *m_socket; }; MyThread::MyThread(QObject *parent) : QThread(parent), m_socket(nullptr) { } void MyThread::run() { m_socket = new QTcpSocket(); m_socket->connectToHost("127.0.0.1", 8888); //连接服务器 if (m_socket->waitForConnected()) { //连接成功 emit messageReceived("Connected to server"); m_socket->write("Hello server"); //向服务器发送消息 if (m_socket->waitForReadyRead()) { //等待接收服务器返回的消息 QByteArray data = m_socket->readAll(); emit messageReceived(data); } } else { emit messageReceived("Failed to connect to server"); } m_socket->close(); delete m_socket; } //在主线程中创建MyThread对象,并监听它的信号 int main(int argc, char *argv[]) { QApplication app(argc, argv); MyThread thread; QObject::connect(&thread, &MyThread::messageReceived, [](const QString &msg){ qDebug() << msg; }); thread.start(); return app.exec(); } ``` 在这个例子中,MyThread类继承自QThread类,并在run()函数中执行TCP通信相关的操作。当连接服务器成功或失败时,MyThread对象会发出messageReceived信号,并传递相应的消息。 在主线程中创建MyThread对象,并监听它的信号,这样就可以在主线程中获取到TCP通信相关的消息了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值