QT网络编程——TCP客户端连接到服务器

前言

1.在Qt中,QtNetwork模块是用来进行网络编程,Qt提供了一层统一的套接字抽象用于编写不同层次的网络程序,避免了应用套接字进行网络编的繁琐,对不同平台,Qt都可以很好的支持,不用另外添加别的库。
2.而TCP:(Transmission Control Protocol 传输控制协议)是网络编程的其中一种,它是面向连接的相对可靠的基于字节流的传输层通信协议。相比UDP的开放式无连接不可靠的传输层通信协议安全性要好一些。
3.我的开发环境是:QT Creator 5.7,我最终的项目是想做成客户端与服务器能互发文本信息,上传、下载文件,互发图像文件,就是客户端往服务器发送图像,服务器器接收成功之后,使用OpenCV做相关的图像处理之后返回之前发出的服务器。

服务器

1.新建一个TCPServer的项目,然后在pro文件里面添加QtNetwork模型。代码如下:

QT     += network

2.因为可视化可以更好的体现整个流程,这里我用Qt搭了一个简易的界面,如下图:
在这里插入图片描述
这里我指定的服务器的IP地址为127.0.0.1,端口是8000,这个也可以按自己的需求改。
3.然后给监听这个功能添加代码,运行程序之后,只有你点击监听这个按键,服务器才算正式启动,开始监听是新的客户端开始连接。

//启动服务器开始监听
void Server::on_buttonMonitor_clicked()
{
    //监听所有IP地址
    bool monitor = tcpServer->listen(QHostAddress::Any,ui->lineEditServerPorts->text().toInt());
    //按键状态
    if(monitor)
    {
        ui->buttonMonitor->setEnabled(false);
        ui->buttonDisconnect->setEnabled(true);
        ui->textEditStatus->append("开始监端口......");

    }
    else
    {
        ui->textEditStatus->append("启动服务器失败!");
    }
}

4.断开服务器,当有客户端还连接的时候,会等待指定的时间之后再断开。

//断开与所有客户端的连接
void Server::on_buttonDisconnect_clicked()
{
    //如果有客户端连接
    if(tcpClient.length() > 0)
    {
        for(int i = 0; i < tcpClient.length();i++)
        {
            //断开
            tcpClient.at(i)->disconnectFromHost();
            //等待
            bool dis = tcpClient.at(i)->waitForDisconnected(10000);
            if(dis)
            {
                //删除客户端
                tcpClient.removeAt(i);
            }
            else
            {
                ui->textEditStatus->append("断开连接失败!");
            }
        }
        tcpServer->close();
        ui->buttonMonitor->setEnabled(true);
        ui->buttonDisconnect->setEnabled(false);
        ui->textEditStatus->append("断开连接成功!");
    }
    else
    {
        ui->textEditStatus->append("当前没有连接的客户端!");
    }
}

客户端

1.新建一个TCPClient的项目,然后在pro文件里面添加QtNetwork模型。代码如下:

QT     += network

2.客商的界面如下图:
在这里插入图片描述
3.连接按键添加代码。

//连接服务器
void Client::on_buttonConnect_clicked()
{
    tcpClient->connectToHost(ui->lineEditServerIP->text(),ui->lineEditServerPorts->text().toInt());
    if(tcpClient->waitForConnected(10000))
    {
        ui->buttonConnect->setEnabled(false);
        ui->buttonDisconnect->setEnabled(true);
        ui->buttonSendMessage->setEnabled(true);
        ui->textEditStatus->append("连接服务器成功!");
    }
    else
    {
        ui->textEditStatus->append("连接失败,请检查IP地址和端口!");
    }
}

4.断开与服务器的连接

//断开
void Client::on_buttonDisconnect_clicked()
{
    tcpClient->disconnectFromHost();
    //断开成功
    if (tcpClient->state() == QAbstractSocket::UnconnectedState || tcpClient->waitForDisconnected(1000))
    {
        ui->buttonConnect->setEnabled(true);
        ui->textEditStatus->append("连接已断开!");
        ui->buttonDisconnect->setEnabled(false);
        ui->buttonConnect->setEnabled(true);

    }
    else
    {
        ui->textEditStatus->append("无法断开与服务器的连接!");
    }
}

测试

1.都添加了代码,就开始测试是否可以连接,首先先启动服务器端,然后输入IP地址和端口,按一监听键,开始监听。
在这里插入图片描述
2.启动客户端,输入服务器的IP地址和端口,点连接按钮,开始连接到服务器。
在这里插入图片描述
3.当前客户端已经连接上客服器,那接下要做的事,如果让客户端往服务器发信息,或者服务器把信息返回给客户端,或者以广播的形式向所有连接到的客户端都发信息。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章