zoukankan      html  css  js  c++  java
  • Qt---tcp之网络通信

    浏览器与服务器之间建立连接的过程
    --------------------------------------------------------------------------------------------------

      web浏览器与服务器之间的一次完整的http请求响应过程:
      1.浏览器根据所使用的http协议,解析出对应的域名
      2.通过DNS域名解析,查询出对应的ip地址
      3.通过url解析出对应的端口号,如果是80端口,默认可以省略
      4.浏览器发起并建立到ip地址的80端口的连接 ----------------先得到域名,通过域名得到ip,再通过url得到端口 ,之后发起tcp连接
      5.浏览器向服务器发起get请求--------------------------------连接之后然后再发送get请求数据
      6.服务器响应浏览器的请求,浏览器读取响应,渲染网页---------------------------服务器响应请求发送数据,浏览器接受到之后解析网页
      7.浏览器关闭与服务器的连接--------------数据传送完毕断开链接

    -----------------------------------------------------------------------------------------------------------
    接下来对tcp连接做一些解释:套接字,是支持TCP/IP的网络通信的基本操作单元,可以看做是不同主机之间的进程进行双向通信的端点,简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程。
    相当于联通网络与程序代码之间的接口
    ----------------------------------------------------------------------------------------------- Tcp的网络连接的过程: 首先对于服务器: 1、服务器有两个套接字:监听套接字、通信套接字(对于某些语言来说可能还要开启套接字服务才能创建套接字) 2、监听套接字分为:创建套接字、bind绑定ip和端口、listen监听外来连接(在bind绑定的之前还要进行连接地址的设置) 3、之后就是通信套接字:accept建立连接 -----在qt小红可以用newconnection来表示有新的客户端连接过来了
    tcpSocket=tcpServer->nextPendingConnection();  -----------通过这个函数去取得通信套接字
    4、建立连接之后就开始进行,write,read发送和读取信息
    再来看看客户端的:
    1、同样的创建套接字
    2、发送connect连接请求(在发送connect之前还要设置要连接的服务器的地址信息)连接成功之后,qt会自动发出connected信号
    3、请求成功之后再进行write、read发送和读取信息
    
    
    Qt==network
    在qt中有个监听
    
    QT的槽函数,都是指针类型Lambda表达式
    ---------》[=](){};=表示值传递,外部所有的局部变量,和类中的成员变量,值不可以被修改
    ---------》[&](){};=表示引用传递,外部所有的局部变量,值可以被修改,引用如果被销毁,则引用会报错
    ---------》一般用[=](){}
    
    QT中有一个对象树:从QObject这个根开始一直往下走,只要对象在继承的时候指定了父对象,那么当程序结束的时候
    QT就会从最开始的QObject去往下逐渐的去释放资源
    
    IP地址:一种数字化的地址方案:如:127.0.0.1
    
    域名:一种符号化的地址方案:如:www.hstc.edn.cn
    
    DNS:在Internet上域名与IP地址之间是一对一(或者多对一)的,域名虽然便于人们记忆,但机器之间只能互相认识IP地址,它们之间的转换工作称为域名解析,域名解析需要由专门的域名解析服务器来完成,DNS就是进行域名解析的服务器。域名的最终指向是IP
    
    URL:统一资源定位符(英语UniformResourceLocator的缩写)俗称为网址,网址格式为:<协议>://<域名或IP>:<端口>/<路径>。<协议>://<域名或IP>是必需的,<端口>/<路径>有时可省略。如:https://www.baidu.com/
    一个网站的URL是一个网站的一部分,是网站资源的一个子集(URI的子集),是指向网站资源的统一定位符
    很多情况下,URL都是在网址后面配上参数。也就是说网址通常是URL的上一级地址。如:https://blog.csdn.net/ParanoidYang/article/details/54288370
    
    QT中的网络通信有:
    服务器:
    QTcpServer  //监听套接字 
    QTcpScoket  //通信套接字
    1、创建套接字后进行监听------------------
    2、当有用户连接的时候就会触发newConnection
    并且返回通信套接字,然后就开始进行readyread
     tcpServer=new QTcpServer(this);
        tcpServer->listen(QHostAddress::Any,8888);
        connect(tcpServer,&QTcpServer::newConnection,[=](){
            tcpSocket=tcpServer->nextPendingConnection();
            QString ip=tcpSocket->peerAddress().toString();
            qint16 port=tcpSocket->peerPort();
            QString temp=QString("[%1:%2]:成功连接").arg(ip).arg(port);
            ui->textEditRead->setText(temp);
    
            connect(tcpSocket,&QTcpSocket::readyRead,[=](){
                QByteArray array=tcpSocket->readAll();
                ui->textEditRead->append(array);
            });
        });
    发送消息:
    void Widget::on_pushButton_clicked()
    {
        if(tcpSocket==nullptr)
        {
            return;
        }
        //获取编辑区的内容
        QString str=ui->textEditWriter->toPlainText();
        tcpSocket->write(str.toUtf8().data());
    
    }
    断开连接:
    void Widget::on_pushButton_2_clicked()
    {
        if(tcpSocket==nullptr)
        {
            return;
        }
        tcpSocket->disconnectFromHost();
        tcpSocket->close();
        tcpSocket=nullptr;
    }
    客户端:
    由于客户端是请求数据的从而一旦请求成功就会触发connected
    之后也是发送信息
     tcpSocket=nullptr;
        tcpSocket=new QTcpSocket(this);
        connect(tcpSocket,&QTcpSocket::connected,[=](){
            ui->textEditReader->setText("服务器连接成功");
        });
        connect(tcpSocket,&QTcpSocket::readyRead,[=](){
            QByteArray array=tcpSocket->readAll();
            ui->textEditReader->setText(array);
        });
    发送消息:
    void QtSocket::on_pushButtonSend_clicked()
    {
        if(tcpSocket==nullptr)
        {
            return;
        }
        QString str=ui->textEditWriter->toPlainText();
        tcpSocket->write(str.toUtf8().data());
    }
    
    断开连接:
    void QtSocket::on_pushButtonClose_clicked()
    {
        if(tcpSocket==nullptr)
        {
            return;
        }
        tcpSocket->disconnectFromHost();
        tcpSocket->close();
        tcpSocket=nullptr;
    }
    
    ------------------------------------------------------------------------------------------------
  • 相关阅读:
    【整理】互联网服务端技术体系:存储基础之数据存储与索引结构
    python基础之enumerate() 函数+ Counter类计数器
    介绍几个好用的Java库
    【GIS】BlenderGIS应用配置之一
    使任意同步库快速变asyncio异步语法的方式 ,run_in_executor
    mysql查看表行数
    mysql8.0使用mysqldump报错:Unknown table ‘column_statistics‘ in information_schema (1109)
    sysbench安装使用,结果信息分析
    【1.6】shell使用 -p -f 之类的参数
    右键新建项中添加Typora新建Markdown文件快捷选项
  • 原文地址:https://www.cnblogs.com/z2529827226/p/11876691.html
Copyright © 2011-2022 走看看