Qt---tcp之网络通信

感情迁移 提交于 2019-12-04 18:04:36
-----------------------------------------------------------------------------------------------
Tcp的网络连接的过程:
首先对于服务器:
1、服务器有两个套接字:监听套接字、通信套接字(对于某些语言来说可能还要开启套接字服务才能创建套接字)
2、监听套接字分为:创建套接字、bind绑定ip和端口、listen监听外来连接(在bind绑定的之前还要进行连接地址的设置)
3、之后就是通信套接字:accept建立连接
4、建立连接之后就开始进行,write,read发送和读取信息
再来看看客户端的:
1、同样的创建套接字
2、发送connect连接请求(在发送connect之前还要设置要连接的服务器的地址信息)
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;
}

------------------------------------------------------------------------------------------------

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!