TCP网络编程--客户端/服务器

QT -----TCP网络编程

1.主要流程
1.客户端
  • 创建QTcpSocket对象
  • 连接到服务器 --connectToHost()
  • 发送数据 —write()
  • 读取数据 —readAll()
  • 断开连接
2.服务器
  • 创建QTcpServer 对象
  • 绑定本地信息—listen(QHostAddress::Any,端口)
  • 等待客户端连接—newConnection()
  • 读取数据
  • 发送数据
  • 断开连接
2.头文件
  • 客户端:#include < QTcpSocket >
  • 服务器:#include < QTcpServer >
  • 必须要在pro文件加上-----QT += core gui network

3.代码

1.客户端
  • widget.h

    #ifndef WIDGET_H
    #define WIDGET_H
    
    #include <QWidget>
    #include <QtNetwork/QTcpSocket>
    #include <QKeyEvent>
    
    namespace Ui {
    class Widget;
    }
    
    class Widget : public QWidget
    {
        Q_OBJECT
    
    
    private:
        QTcpSocket *client;
        QString *message;
    
        void keyPressEvent(QKeyEvent *event);
    public:
        explicit Widget(QWidget *parent = nullptr);
        ~Widget();
    
    private:
        Ui::Widget *ui;
    };
    
    #endif // WIDGET_H
    
    
  • widget.cpp

    #include "widget.h"
    #include "ui_widget.h"
    #include <QTextEdit>
    Widget::Widget(QWidget *parent) :
        QWidget(parent),
        ui(new Ui::Widget)
    {
        ui->setupUi(this);
    
        client = new QTcpSocket(this);
    
        ui->Button_send->setEnabled(false);
    
        /*  连接服务器  */
        connect(ui->Button_connection,&QPushButton::released,this,
                [=]()
                {
                    client->connectToHost(ui->lineEdit_ip->text(),ui->lineEdit_d->text().toInt());
                });
        /*  连接成功    */
        connect(client,&QTcpSocket::connected,this,
                [&]()
                {
                    ui->Button_send->setEnabled(true);
                    ui->label_prompt->setText("已连接");
                    ui->textEdit_receive->append("连接成功……");
                });
    
        /* 发送到服务器 */
       connect(ui->Button_send,&QPushButton::released,this,
               [&]()
               {
                   QString data = ui->textEdit_edit->toPlainText();
                   if(data.length() > 0)                //如果输入框不为空才可以发送
                   {
                       client->write(data.toUtf8());
                       QString data1 = "已发送:"+data;
                       ui->textEdit_receive->append(data1);
                   }
                   else {
                       ui->textEdit_receive->append("输入信息");
                   }
    
               });
    
       /*    接收信息   */
       connect(client,&QTcpSocket::readyRead,this,
               [&]()
               {
                   QString msg = "收到:" + client->readAll();
                   ui->textEdit_receive->append(msg);
               });
    
    
        /*  断开连接    */
        connect(ui->Button_disconnect,&QPushButton::released,this,
                [=]()
                {
                    client->disconnectFromHost();
                    ui->Button_send->setEnabled(false);
                });
        /*  断开连接    */
        connect(client,&QTcpSocket::disconnected,this,
                [&]()
                {
                    ui->label_prompt->setText("未连接……");
                    ui->textEdit_receive->append("断开连接……");
                });
    
    
    }
    
    /*    键盘事件:捕获按下回车键发送---这一部分可选择不要 */
    void Widget::keyPressEvent(QKeyEvent *event)
    {
        int key = event->key();
        if(key == Qt::Key_Enter)
        {
            QString data = ui->textEdit_edit->toPlainText();
            if(data.length() > 0)
            {
                client->write(data.toUtf8());
                QString data1 = "已发送:"+data;
                ui->textEdit_receive->append(data1);
            }
            else {
                ui->textEdit_receive->append("输入信息");
            }
    
        }
    }
    Widget::~Widget()
    {
        delete ui;
    }
    
    
2.服务器
  • widget.h

    #ifndef WIDGET_H
    #define WIDGET_H
    
    #include <QWidget>
    #include <QtNetwork/QTcpServer>
    #include <QtNetwork/QTcpSocket>
    #include <QKeyEvent>
    
    namespace Ui {
    class Widget;
    }
    
    class Widget : public QWidget
    {
        Q_OBJECT
    
    public:
        QTcpServer *server;
        QTcpSocket *socket;
    
        void new_client();
        void send_data();
        void read_data();
        void disconnect();
    
        void keyPressEvent(QKeyEvent *event);     //重写键盘事件虚函数,如果不要键盘发											  //送可选择删掉
    public:
        explicit Widget(QWidget *parent = nullptr);
        ~Widget();
    
    private:
        Ui::Widget *ui;
    };
    
    #endif // WIDGET_H
    
    
  • widget.cpp

    #include "widget.h"
    #include "ui_widget.h"
    #include <QDebug>
    
    Widget::Widget(QWidget *parent) :
        QWidget(parent),
        ui(new Ui::Widget)
    {
        ui->setupUi(this);
    
        ui->Button_send->setEnabled(false);
        server = new QTcpServer(this);
    
        /*  绑定绑定信息  */
        server->listen(QHostAddress::Any,ui->lineEdit_d->text().toInt());
    
        /*  等待客户端连接 */
        connect(server,&QTcpServer::newConnection,this,&Widget::new_client);
    
        /*  发送信息    */
        connect(ui->Button_send,&QPushButton::released,this,&Widget::send_data);
    
    
    }
    
    /*  等待连接    */
    void Widget::new_client()
    {
        qDebug() << "新客户连接";
        ui->label_prompt->setText("已连接");
        ui->textEdit_log->append("连接成功");
        ui->Button_send->setEnabled(true);
        socket = server->nextPendingConnection();
        connect(socket,&QTcpSocket::readyRead,this,&Widget::read_data);
        connect(ui->Button_disconnect,&QPushButton::released,socket,&QTcpSocket::disconnectFromHost);
        connect(socket,&QTcpSocket::disconnected,this,
                [&]()
                {
                   ui->textEdit_log->append("断开连接");
                });
    }
    /*  发送信息  */
    void Widget::send_data()
    {
        QString data = ui->textEdit_edit->toPlainText();
        if(data.length() > 0)               //如果输入栏不为空才可以发送
        {
            socket->write(data.toUtf8());
            QString data1 = "已发送:" + data;
            ui->textEdit_log->append(data1);
        }
        else {
            ui->textEdit_log->append("输入信息");
        }
    }
    
    /*  接收信息    */
    void Widget::read_data()
    {
       // QTcpSocket *obj = (QTcpSocket*)sender();
         QString msg = "收到:" + socket->readAll();
         ui->textEdit_log->append(msg);
    }
    
    /*  断开连接    */
    void Widget::disconnect()
    {
        ui->textEdit_log->append("断开连接");
        ui->Button_send->setEnabled(false);
    }
    
    /*      回车键发送  -----  可选择不要 */
    void Widget::keyPressEvent(QKeyEvent *event)
    {
        int key = event->key();
        if(key == Qt::Key_Enter)
        {
            QString data = ui->textEdit_edit->toPlainText();
            if(data.length() > 0)                       //如果输入栏不为空才可以发送
            {
                qDebug() << data.length();
                socket->write(data.toUtf8());
                QString data1 = "已发送:" + data;
                ui->textEdit_log->append(data1);
            }
            else {
                ui->textEdit_log->append("输入信息");
            }
        }
    }
    
    Widget::~Widget()
    {
        delete ui;
    }
    
    

4.布局

  • 客户端
    在这里插入图片描述
  • 服务器
    在这里插入图片描述
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mahuifa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值