• 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";
    }
    
  • 相关阅读:
    设计模式:迭代器模式
    设计模式:观察者模式
    设计模式:解释器模式
    设计模式:策略模式
    设计模式:状态模式
    设计模式:代理模式
    strtok函数
    人们眼中的程序员
    如何用C语言获取文件的大小
    C++著名库的比较和学习经验
  • 原文地址:https://www.cnblogs.com/zhangxuechao/p/11709355.html
Copyright © 2020-2023  润新知