qt网络编程笔记

2021/8/3 12:05:49

本文主要是介绍qt网络编程笔记,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

qt网络编程笔记

前言:这篇笔记是本人在学习qt的网络编程时写的,由于本人没有任何网络编程基础,在这之前也不知道ip,tcp,udp的意思,书上给出的函数不知道怎么用,所以就去找了几个实例大致了解了一下这些东西

TCP:网络传输协议的一种,特点时传输不容易出错,传输文本用的就是这种协议,下面用的是TCP

UDP:同上,传输速度比TCP快但是容易丢失字节,传输视频用的就是这种协议

IP:在网络数据传输中电脑的代号

端口:可以理解为用于找到对应的软件的门,因为数据传输过去后并不知道应该传给哪个软件

基本原理:

在socket编程中,客户端(比如你的手机)与服务端(比如服务器)之间的数据传输是靠socket()实现的。服务端的实现主要有如下几个步骤
  • 创建socket

  • 将socket与指定的ip和端口绑定(bind())

  • 让socket在绑定的端口处监听请求(listen())

  • 客户端成功连接服务端(accept()),服务端收到客户端的套接字,套接字是客户端与服务端进行数据传输的媒介,每个客户端对应一个套接字

  • 接受数据(recv())

  • 发送数据(send())

  • 断开连接(close())

    有了以上的理念之后剩下的就是如何用qt来实现了

    首先要在生成的pro文件的qt模块那一行加上newwork

    QT       += core gui network
    

    然后在头文件中加入下面两个头文件

    #include<QTcpServer>
    #include<QTcpSocket>
    

    在qt中,QTcpServer用于生成一个服务器对象,相当于上面的socket对象.

    QTcpServer * server = new QTcpServer;
    

    接下来就是bind()和listen()操作

    connect(server,&QTcpServer::newConnection,this,[](){
        //对信号的处理
    });
    //在有新的客户端连接时会发送slo_newConnection的信号,这是qt需要额外做的一步
    server->listen(QHostAddress::Any,5555);//绑定和监听对应的端口,通过返回值查看成功与否
    

    然后是生成和处理套接字

    QTcpSocket * socket=server->nextPendingConnection();//在客户端连接上来时成为处理数据的套接字
    

    套接字的读写数据用的是以下两个函数

    write(const char *data);
    readAll();//
    

    于是全部的代码如下

    widget.h

    #ifndef WIDGET_H
    #define WIDGET_H
    
    #include <QWidget>
    #include<QTcpSocket>
    #include<QTcpServer>
    namespace Ui {
    class Widget;
    }
    
    class Widget : public QWidget
    {
        Q_OBJECT
    
    public:
        explicit Widget(QWidget *parent = 0);
        ~Widget();
    private slots:
        void slo_new();//用于对新连接的客户端响应的槽
        void slo_dis();//用于对客户端断开连接相应的槽
        void slo_rec();//接受消息
        void on_pushButton_clicked();//与按钮关联用于发送消息
    
    private:
        Ui::Widget *ui;
        void showmessage(const QString &);//及时更新消息到屏幕上
        QTcpServer * server;
        QList<QTcpSocket*> list_sokets;//用于保存所有用户对应的socket,用qobject_cast方法来找到是哪个socket发送的信号
    };
    
    #endif // WIDGET_H
    
    
    

    widget.cpp

    #include "widget.h"
    #include "ui_widget.h"
    #include<QDateTime>
    #include<QPushButton>
    #include<QHostAddress>
    Widget::Widget(QWidget *parent) :
        QWidget(parent),
        ui(new Ui::Widget)
    {
        ui->setupUi(this);
        server=new QTcpServer;//新建一个服务器对象
        server->listen(QHostAddress::Any,6666);//监听对应的id和6666端口
        connect(server,&QTcpServer::newConnection,this,&Widget::slo_new);//有新客户端连接将发出newconnection的信号
    }
    void Widget::showmessage(const QString & str2)
    {
        QString str=QDateTime::currentDateTime().toString();
        ui->textEdit->append(str+' '+str2);
    }
    void Widget::slo_new()
    {
        QTcpSocket * socket=server->nextPendingConnection();//读取新客户端对应的套接字
        connect(socket,&QTcpSocket::readyRead,this,&Widget::slo_rec);//关联读取信息的槽
        connect(socket,&QTcpSocket::disconnected,this,&Widget::slo_dis);//关联客户端断开的槽
        showmessage(QString::fromUtf8("新用户%1连接").arg(socket->peerAddress().toString()));
        list_sokets<<socket;
    }
    void Widget::slo_dis()
    {
        QTcpSocket * socket=qobject_cast<QTcpSocket*>(QObject::sender());//获取发送信号的socket
        showmessage(QString::fromUtf8("用户%1断开").arg(socket->peerAddress().toString()));
        list_sokets.removeOne(socket);//将这个socket从列表移除
        socket->disconnect(socket,0,this,0);//断开连接
        socket->deleteLater();
    }
    void Widget::slo_rec()
    {
        QTcpSocket * socket=qobject_cast<QTcpSocket*>(QObject::sender());//获取发送信号的socket
        QString str=QString::fromUtf8(socket->readAll());//读取消息
        showmessage(socket->peerAddress().toString()+":\n"+str);
    }
    
    
    Widget::~Widget()
    {
        delete ui;
    }
    
    void Widget::on_pushButton_clicked()
    {
        if(list_sokets.isEmpty())
        {
            showmessage("没人");
            return ;
        }
        for(auto socket :list_sokets)
        {
            socket->write(ui->lineEdit->text().toUtf8());
        }
    
    }
    
    
    客户端的搭建要简单一些
    • 创建socket

    • 连接服务端

    • 收发消息

    • 断开连接

      代码如下

      widget.h

      #ifndef WIDGET_H
      #define WIDGET_H
      
      #include <QWidget>
      #include<QTcpServer>
      #include<QTcpSocket>
      #include<QHostAddress>
      namespace Ui {
      class Widget;
      }
      
      class Widget : public QWidget
      {
          Q_OBJECT
      
      public:
          explicit Widget(QWidget *parent = 0);
          ~Widget();
           void showmessage(const QString &);//及时更新消息到屏幕上
      public slots:
          void slo_rec();//接受消息
      private slots:
          void on_pushButton_2_clicked();
      
          void on_pushButton_clicked();
      
      private:
          Ui::Widget *ui;
          QTcpSocket * socket;
      };
      
      #endif // WIDGET_H
      
      
      

      widget.cpp

      #include "widget.h"
      #include "ui_widget.h"
      #include<QString>
      #include<QDateTime>
      Widget::Widget(QWidget *parent) :
          QWidget(parent),
          ui(new Ui::Widget)
      {
          ui->setupUi(this);
          socket = new QTcpSocket;
      }
      
      Widget::~Widget()
      {
          delete ui;
          socket->close();
      }
      
      void Widget::on_pushButton_2_clicked()//连接服务端
      {
          socket->connectToHost(QHostAddress::LocalHost,6666);//第一个参数为本地主机地址
          if(QTcpSocket::UnconnectedState==socket->state())
          {
              showmessage(QString::fromUtf8("连接失败"));
              return ;
          }
          else
              showmessage(QString::fromUtf8("连接成功"));
          connect(socket,&QTcpSocket::readyRead,this,&Widget::slo_rec);//关联服务端来接受新信息
      }
      void Widget::slo_rec()
      {
          showmessage(QString::fromUtf8(socket->readAll()));
      }
      
      void Widget::showmessage(const QString & str2)
      {
          QString str=QDateTime::currentDateTime().toString();
          ui->textEdit->append(str+' '+str2);
      }
      void Widget::on_pushButton_clicked()
      {
          socket->write(ui->lineEdit->text().toUtf8());
      }
      
      


这篇关于qt网络编程笔记的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程