01 QT的服务器和客户端TCP通讯

在服务端中,先在widget.h中先定义好

    QTcpServer *tcpServer;
    QTcpSocket *tcpSocket;

这两个变量,然后再widget.cpp中调用,

//先初始化参数
tcpServer=NULL;
tcpSocket=NULL;

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

设置监听套接字这样才能对其使用的空间进行回收,监听进程,当有客户端连接时分配空间,使用connect函数进行连接,建立套接字进行通讯,在创建套接字之后可以在连接的connect函数内在进行数据接收,使用另一个connect函数,如下所示

connect(tcpServer,&QTcpServer::newConnection,
            [=]()
    {
        //取出建立好连接的套接字

        tcpSocket=tcpServer->nextPendingConnection();

        //获取对方的IP和端口
        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,
        [=]()
        {
              QString array=tcpSocket->readAll();
              ui->textEditRead->append(array);
        });

    });

01 QT的服务器和客户端TCP通讯_第1张图片
写好主函数的内容后,在ui界面选择发送按钮右键选择转到槽函数,在槽函数中如下代码所示

//获取编辑区
    if(tcpSocket==NULL)
    {
        return;
    }
    QString str=ui->textEditWrite->toPlainText();

    tcpSocket->write(str.toUtf8().data());
    tcpSocket=NULL;

首先判断是否建立套接字,如果不是则return,不然则发送textEditWrite的内容,我们也可以写一个断开连接的槽函数,跟发送槽函数一样操作,在槽函数中,写如下代码,使用tcpsocket的disconnectFrom Host和close函数

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

这样服务器端就大概写好了,客户端与此差不多,clientwidget.h 代码如下

#ifndef CLIENTWIDGET_H
#define CLIENTWIDGET_H

#include 
#include 

namespace Ui {
class ClientWidget;
}

class ClientWidget : public QWidget
{
    Q_OBJECT

public:
    explicit ClientWidget(QWidget *parent = 0);
    ~ClientWidget();

private slots:
    void on_buttonconnect_clicked();

    void on_pushButtonSend_clicked();

    void on_pushButtonClose_clicked();

private:
    Ui::ClientWidget *ui;

    QTcpSocket *tcpSocket;
};

#endif // CLIENTWIDGET_H

clientwidget.cpp

#include "clientwidget.h"
#include "ui_clientwidget.h"
#include 
#include 

ClientWidget::ClientWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::ClientWidget)
{
    ui->setupUi(this);

    tcpSocket=NULL;


    tcpSocket =new QTcpSocket(this);

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

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

ClientWidget::~ClientWidget()
{
    delete ui;
}

void ClientWidget::on_buttonconnect_clicked()
{
    //获取服务器IP和端口
    QString ip=ui->lineEdit_2IP->text();
    qint16 port=ui->lineEditPort->text().toInt();

    //主动和服务器建立连接
    tcpSocket->connectToHost(QHostAddress(ip),port);
}

void ClientWidget::on_pushButtonSend_clicked()
{
    //获取编辑框内容
    //主动和客户端断开连接
    if(tcpSocket==NULL)
    {
        return;
    }
    QString str =ui->textEditWrite->toPlainText();

    tcpSocket->write(str.toUtf8().data());
    tcpSocket=NULL;
}

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

}

敲好代码后运行就可以出现两个界面,一个是服务端,一个是客户端,输入8888,127.0.0.1 建立连接,便可以进行TCP通讯
01 QT的服务器和客户端TCP通讯_第2张图片

你可能感兴趣的:(Qt)