QT之TCP/IP通信---服务端

项目需求:使用QT的TCP实现客户端与服务端的通信,界面如下

写在开头:几个重要的方法与信号

//监听方法,监听本机所有IP的9999端口
tcpServer->listen(QHostAddress::Any, 9999);    

//当新连接建立时触发该信号
&QTcpServer::newConnection    

//A. 取出tcpSocket套接字
tcpSocket = tcpServer->nextPendingConnection();

//B. 取出套接字中的IP信息
QString ip = tcpSocket->peerAddress().toString();
qint16 port = tcpSocket->peerPort();

//收到对方发来的数据的时候触发该信号
&QTcpSocket::readyRead

//将数据写入通信套接字
tcpSocket->write(str.toUtf8().data());


//断开与客户端的连接
tcpSocket->disconnectFromHost();
tcpSocket->close();

服务端的实现

1.  引用网络模块到QT中( .pro文件)

QT += network   #1. 引用网络模块

 2. 引用套接字头文件(server.h)

//2. 引用头文件
#include <QTcpServer>   //监听套接字
#include <QTcpSocket>   //通信套接字
#include <QHostAddress>

3.  创建套接字对象(server.h)

private:
    Ui::ServerWidget *ui;

    //3. 创建对象
    QTcpServer *tcpServer;  //监听套接字
    QTcpSocket *tcpSocket;  //通信套接字

4.  给对象分配空间(server.cpp)

    //4. 给对象分配空间
    tcpServer = new QTcpServer(this);   //监听套接字

5.  引用Lamda表达式模块(.pro)

CONFIG += C++11     #5. 需要使用Lamda表达式

6. 监听端口(server.cpp)

    //6. 服务端监听本机的所有IP中的9999端口
    tcpServer->listen(QHostAddress::Any, 9999);

7.  取出套接字中的信息(server.cpp)

    //7. 取出tcpSocket中的信息
    connect(tcpServer, &QTcpServer::newConnection,
            [=]()
            {
                //A. 取出tcpSocket套接字
                tcpSocket = tcpServer->nextPendingConnection();

                //B. 取出套接字中的IP信息
                QString ip = tcpSocket->peerAddress().toString();
                qint16 port = tcpSocket->peerPort();

                //C. 拼接显示信息
                QString temp = QString("[%1:%2]:Connect Success!").arg(ip).arg(port);
                ui->textEditReceive->setText(temp);

                //D. 接受数据
                connect(tcpSocket, &QTcpSocket::readyRead,
                        [=]()
                        {
                            //读取通信套接字中的所有数据
                            QByteArray array = tcpSocket->readAll();
                            //显示到UI中
                            ui->textEditReceive->append(array);
                        }
                        );

            }
            );

8. 实现发送功能(server.cpp)

//当发送按钮被点击的时候,发送内容到客户端
void ServerWidget::on_buttonSend_clicked()
{
    if(tcpSocket == NULL)
    {
        return;
    }

    //A. 获取文本框的内容
    QString str = ui->textEditSend->toPlainText();

    //B. 将数据写入通信套接字
    tcpSocket->write(str.toUtf8().data());
}

9. 实现断开连接功能(server.cpp)

//当点击关闭的时候,断开与客户端的连接
void ServerWidget::on_buttonClose_clicked()
{
    if(tcpSocket == NULL)
    {
        return;
    }

    tcpSocket->disconnectFromHost();
    tcpSocket->close();
    tcpSocket = NULL;
    ui->textEditReceive->append("与客户端连接已断开");

}

下一篇实现客户端。

本文原创,转载请注明出处。

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