基于QT实现简单的TCP通信

开发环境:win7
开发软件:Qt5.5.0
下图是实现效果
在这里插入图片描述
首先点击客户端的connect与服务器连接,连接成功后再服务器会显示“成功连接”,然后在客户端会显示“成功与服务器建立连接”,然后我们就可以分别在服务器和客户端向对方发送数据了。

1 TCP介绍

传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。
在QT中的网络编程的过程如下:服务器有两个套接字,一个负责监听(QTcpServer),另一个负责通信(QTcpSocket),而客户端只有一个负责通信的套接字(QTcpSocket)。
通信过程如下图:
在这里插入图片描述

2 Tcp服务器实现

//监听套接字,指定父对象,让其自动回收空间
tcpServer = new QTcpServer(this);
tcpServer->listen(QHostAddress::AnyIPv4, 6000);

当有新的连接建立时,在服务器界面接收区处显示客户端地址和端口,并且等待数据发送过来,接收并显示:

connect(tcpServer, &QTcpServer::newConnection,
            [=](){
                //取出建立好连接的套接字
                //cout << "有新的客户端进行连接";
                tcpSocket = tcpServer->nextPendingConnection();
                //获取对方的IP和端口
                QString ip = tcpSocket->peerAddress().toString();
                quint16 port = tcpSocket->peerPort();
                QString temp = QString("[%1:%2]:成功连接").arg(ip).arg(port);        
                ui->textEditRead->setText(temp);
                
                connect(tcpSocket, &QTcpSocket::readyRead,
                        [=](){
                            //cout << "有数据从客户端发过来";
                            //从通信套接字取出内容
                            QByteArray array = tcpSocket->readAll();
                            ui->textEditRead->append(array);
                        }
                        );
            }
            );
}

发送数据:

void ServerWidget::on_buttonSend_clicked()
{
    if(NULL == tcpSocket){
        return;
    }
    //获取编辑区内容
    QString str = ui->textEditWrite->toPlainText();
    //给对方发送数据。使用套接字是tcpSocket
    tcpSocket->write(str.toUtf8().data());
}

点击close按钮,如果tcpSocket没有分配内存,则退出,否则断开连接。

void ServerWidget::on_buttonClose_clicked()
{
    if(NULL == tcpSocket){
        return;
    }
    //主动和客户端断开连接
    tcpSocket->disconnectFromHost();
    tcpSocket->close();
    tcpSocket = NULL;
}

3 TCP客户端实现

分配空间,指定父对象

tcpSocket = new QTcpSocket(this);

如果服务器发送连接成功,则客户端显示“成功与服务器建立连接”。

    connect(tcpSocket, &QTcpSocket::connected,
            [=](){
                ui->textEditRead->setText("成功与服务器建立连接");
            }
            );

客户端读取数据,并显示在接收区

    connect(tcpSocket, &QTcpSocket::readyRead,
            [=](){
                //获取服务器发送的内容
                QByteArray array = tcpSocket->readAll();
                ui->textEditRead->append(array);
            }
            );

按下connect按钮,主动与服务器建立连接

void ClientWidget::on_pushButtonConnect_clicked()
{
    //获取服务器ip和端口
    QString ip = ui->lineEditIP->text();
    quint16 port = ui->lineEditPort->text().toInt();
    //主动和服务器建立连接
    tcpSocket->connectToHost(QHostAddress(ip), port);
}

按下send按钮,发送数据,转成utf-8格式

void ClientWidget::on_pushButtonSend_clicked()
{
    if(NULL == tcpSocket){
        return;
    }
    //获取编辑区内容
    QString str = ui->textEditWrite->toPlainText();
    //给对方发送数据,使用套接字是tcpSocket
    tcpSocket->write(str.toUtf8().data());
}

按下close关闭连接

void ClientWidget::on_pushButtonClose_clicked()
{
    tcpSocket->disconnectFromHost();
    tcpSocket->close();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值