Qt TCP通信

工程文件

QT       += network

服务端

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTcpServer>
#include <QTcpSocket>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

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

private:
    Ui::Widget *ui;
    QTcpServer *server;
    QTcpSocket *socket;

    void init();

private slots:
    void new_client();
    void read_client_data();
    void client_dis();
    void show_error(QAbstractSocket::SocketError);
};

#endif // WIDGET_H
#include "widget.h"
#include "ui_widget.h"
#include <qDebug>

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

    init();
}

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

void Widget::init()
{
    //初始化服务器server对象
    server = new QTcpServer(this);

    //关联客户端连接信号newConnection
    connect(server, SIGNAL(newConnection()), this, SLOT(new_client())); //连接客户端
    //启动服务器监听
    server->listen(QHostAddress::Any, 8888);
}

void Widget::new_client()
{
    qDebug() << "new_client here";

    socket = server->nextPendingConnection();//与客户端通信的套接字

    //关联接收客户端数据信号readyRead信号(客户端有数据就会发readyRead信号)
    connect(socket, SIGNAL(readyRead()), this, SLOT(read_client_data()));
    //检测掉线信号
    connect(socket, SIGNAL(disconnected()), this, SLOT(client_dis()));
    /* socket出错 -> 出错处理 */
    connect(socket, SIGNAL(error(QAbstractSocket::SocketError)),
            this, SLOT(show_error(QAbstractSocket::SocketError)));
}

void Widget::read_client_data()
{
    qDebug() << "read_client_data here";

    QTcpSocket *obj = (QTcpSocket*)sender(); //可实现多连接
    QString msg = obj->readAll();
    qDebug() << msg;
}

void Widget::show_error(QAbstractSocket::SocketError)
{
    qDebug() << "show_error here";
    qDebug() << socket->errorString();

    socket->close();
}

void Widget::client_dis()
{
    qDebug() << "client_dis here";

    socket->close();
}

客户端

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QAbstractSocket>
#include <QTcpSocket>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

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

private slots:
    void start_transfer();
    void continue_transfer(qint64);
    void show_error(QAbstractSocket::SocketError);
    void stop_transfer();

private:
    Ui::Widget *ui;
    QTcpSocket *socket;

    void init();
};

#endif // WIDGET_H
#include "widget.h"
#include "ui_widget.h"
#include <QHostAddress>

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

    init();
}

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

void Widget::init()
{
    socket = new QTcpSocket(this);

    socket->connectToHost(QHostAddress::LocalHost, 8888);

    /* 连接已建立 -> 开始发数据 */
    connect(socket, SIGNAL(connected()),
            this, SLOT(start_transfer()));
    /* 数据已发出 -> 继续发 */
    connect(socket, SIGNAL(bytesWritten(qint64)),
            this, SLOT(continue_transfer(qint64)));
    /* socket出错 -> 错误处理 */
    connect(socket, SIGNAL(error(QAbstractSocket::SocketError)),
            this, SLOT(show_error(QAbstractSocket::SocketError)));
    /* 检测掉线信号 */
    connect(socket, SIGNAL(disconnected()), this, SLOT(stop_transfer()));
}

void Widget::start_transfer()
{
    qDebug() << "start_transfer here";

    QString msg = "hello furong";
    socket->write(msg.toUtf8());
}

void Widget::continue_transfer(qint64 sentSize)
{
    qDebug() << "continue_transfer sentSize" << sentSize;

    QString msg = "I love Y";
    socket->write(msg.toUtf8());

    socket->close();
}

void Widget::show_error(QAbstractSocket::SocketError)
{
    qDebug() << "show_error here";

    socket->close();
}

void Widget::stop_transfer()
{
    qDebug() << "stop_transfer here";
}
posted @   thomas_blog  阅读(111)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示