zoukankan      html  css  js  c++  java
  • QT--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.布局

    • 客户端
    • 服务器
  • 相关阅读:
    谈谈Android重打包--初语
    Servlet注解
    提高打开Android本地文档的速度
    内置传感器---智能手机(资料)
    数学分析里面的蕴含(⇒)究竟是什么意思
    [Xcode 实际操作]七、文件与数据-(20)CoreML机器学习框架:检测和识别图片中的物体
    [Xcode 实际操作]七、文件与数据-(19)颜色集(Color Set)的使用
    [Xcode 实际操作]七、文件与数据-(18)使用MarkMan与设计师进行心灵沟通
    [Xcode 实际操作]七、文件与数据-(17)解析JSON文档
    [Xcode 实际操作]七、文件与数据-(16)解析XML文档
  • 原文地址:https://www.cnblogs.com/IntelligencePointer/p/11463077.html
Copyright © 2011-2022 走看看