QT实现TCP服务端与客户端通信

前言

网络通信是程序员必须会的一项生存技能,这里简单的实现了服务端和客户端通信的两个小示例,代码可以直接拿来用,开发环境是Qt5.10.1。

1.TCP服务端

1.1 QT中TCP服务器的开发思路

1、开启服务器开启端口服务:建立QTcpServer对象,并用其中的listen()方法就可以开启指定的端口。

tcpServer->listen(QHostAddress::Any,ui->lineEdit_port->text().toUInt());    //服务器对端口号进行监听

2、当有客户端连接到服务器时,系统会接收到newConnection信号,所以需要在对应的槽函数中获取用于通信的套接字(QTcpServer的nextPendingConnection()函数获取套接字)。

tcpSocket = tcpServer->nextPendingConnection();     //获取与客户端进行通信的套接字

3、客户端有数据过来,则会产生一个readyRead信号,从对应的槽函数中通过套接字的readAll()等相关函数读取数据。

buf = QString(tcpSocket->readAll());    //用套接字读取客户端发来的数据

4、通过套接字的write()函数向客户端发送数据。

tcpSocket->write(ui->lineEdit_send->text().toLocal8Bit().data());

备注:ui界面控件名称可能和下述.h/.cpp代码中不一致,原理一样

1.2 QT中TCP服务器的界面设计

在这里插入图片描述

1.3 QT中TCP服务器的代码实现

1)在pro文件中添加一行内容:QT += network
2).h头文件

#ifndef QTSERVER_H
#define QTSERVER_H

#include <QMainWindow>
#include <QTcpServer>
#include <QTcpSocket>
#include <QLabel>

namespace Ui {
class QtServer;
}

class QtServer : public QMainWindow
{
    Q_OBJECT

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

private slots:
    void on_setListen_clicked();

    void on_sendMsg_clicked();

private:
    Ui::QtServer *ui;
    QTcpServer *m_s;
    QTcpSocket *m_tcp;
    QLabel *m_status;
};

#endif // QTSERVER_H

3).cpp文件

#include "qtserver.h"
#include "ui_qtserver.h"

QtServer::QtServer(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::QtServer)
{
    ui->setupUi(this);
    //创建监听的服务器对象
    ui->port->setText("8899");
    setWindowTitle(QString("Server"));

    m_s=new QTcpServer(this);
    //启动监听
    connect(m_s,&QTcpServer::newConnection,this,[=]()
    {

         m_tcp= m_s->nextPendingConnection();

         m_status->setPixmap(QPixmap(":/connect.jpg").scaled(20,20));

        //检测是否可以接收数据
        connect(m_tcp,&QTcpSocket::readyRead,this,[=]()
        {
            QByteArray data=m_tcp->readAll();
            ui->record->append("客户端say:"+data);
        });

        connect(m_tcp,&QTcpSocket::disconnected,this,[=]()
        {
            m_tcp->close();
            m_tcp->deleteLater();//delete m_tcp
            m_status->setPixmap(QPixmap(":/disconnect.jpg").scaled(20,20));
        });

    });
    //状态栏
    m_status=new QLabel;
    m_status->setPixmap(QPixmap(":/disconnect.jpg").scaled(20,20));
    ui->statusBar->addWidget(new QLabel("连接状态: "));
    ui->statusBar->addWidget(m_status);
}

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

void QtServer::on_setListen_clicked()
{
    unsigned short port=ui->port->text().toUShort();
    m_s->listen(QHostAddress::Any,port);
    ui->setListen->setDisabled(true);
}

void QtServer::on_sendMsg_clicked()
{
    QString msg=ui->msg->toPlainText();
    m_tcp->write(msg.toUtf8());
    ui->record->append("服务器say:"+msg);

}

2.TCP客户端

2.1 QT中TCP客户端的开发思路

1、创建QTcpSocket对象,并用connectToHost()函数通过IP和端口号连接服务器。

tcpSocket = new QTcpSocket(this);
tcpSocket->connectToHost(ui->lineEdit_ip->text(),ui->lineEdit_port->text().toUInt());   //根据IP地址和端口号连接服务器

2、客户端成功连接上服务器,系统会产生connected信号。(所以需要将信号和槽函数进行绑定)

connect(tcpSocket,SIGNAL(connected()),this,SLOT(connected_slot()));   //客户端连接服务器成功后会产生connected信号

3、客户端收到服务器发送来的数据,会产生readyRead信号,在connected信号对应的槽函数中,将readyRead信号和对应的槽函数进行绑定。

connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(readyRead_slot()));     //和服务器连接成功后,就需要就收服务器发送过来的数据了,

4、通过套接字对象读取服务器发来的数据。(用readall()等函数)

tcpSocket->readAll();      //从套接字中读取服务器发来的数据

5、通过套接字向服务器发送数据。(用write()函数)

tcpSocket->write(ui->lineEdit_send->text().toLocal8Bit().data());       //向服务器发送数据

2.2 QT中TCP客户端的界面设计

在这里插入图片描述

2.3 QT中TCP客户端的代码实现

1)在pro文件中添加一行内容:QT += network
2).h头文件

#ifndef QTSERVER_H
#define QTSERVER_H

#include <QMainWindow>
#include <QTcpSocket>
#include <QHostAddress>
#include <QLabel>

namespace Ui {
class QtServer;
}

class QtServer : public QMainWindow
{
    Q_OBJECT

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

private slots:

    void on_sendMsg_clicked();

    void on_connect_clicked();

    void on_disconnect_clicked();

private:
    Ui::QtServer *ui;
    QTcpSocket *m_tcp;
    QLabel *m_status;
};

#endif // QTSERVER_H

3).cpp文件

#include "qtserver.h"
#include "ui_qtserver.h"

QtServer::QtServer(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::QtServer)
{
    ui->setupUi(this);
    //创建监听的服务器对象
    ui->port->setText("8899");
    ui->ip->setText("127.0.0.1");
    setWindowTitle(QString("Client"));
    ui->disconnect->setDisabled(true);

    m_tcp =new QTcpSocket(this);

    //检测是否可以接收数据
    connect(m_tcp,&QTcpSocket::readyRead,this,[=]()
    {
        QByteArray data=m_tcp->readAll();
        ui->record->append("服务器say:"+data);
    });

    connect(m_tcp,&QTcpSocket::disconnected,this,[=]()
    {
        m_tcp->close();
        m_tcp->deleteLater();//delete m_tcp
        m_status->setPixmap(QPixmap(":/disconnect.jpg").scaled(20,20));
        ui->record->append("服务器和客户端断开了连接...");
        ui->connect->setDisabled(false);
        ui->disconnect->setEnabled(false);
    });
    connect(m_tcp,&QTcpSocket::connected,this,[=]()
    {
        m_status->setPixmap(QPixmap(":/connect.jpg").scaled(20,20));
        ui->record->append("已经连接成功了服务器...");
        ui->connect->setDisabled(true);
        ui->disconnect->setEnabled(true);
    });

    //状态栏
    m_status=new QLabel;
    m_status->setPixmap(QPixmap(":/disconnect.jpg").scaled(20,20));
    ui->statusBar->addWidget(new QLabel("连接状态: "));
    ui->statusBar->addWidget(m_status);
}

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


void QtServer::on_sendMsg_clicked()
{
    QString msg=ui->msg->toPlainText();
    m_tcp->write(msg.toUtf8());
    ui->record->append("客户端say:"+msg);

}

void QtServer::on_connect_clicked()
{
    QString ip=ui->ip->text();
    unsigned short port =ui->port->text().toUShort();
    m_tcp->connectToHost(QHostAddress(ip),port);
}

void QtServer::on_disconnect_clicked()
{
    m_tcp->close();
    ui->connect->setDisabled(false);
    ui->disconnect->setEnabled(false);
}

效果图

在这里插入图片描述

附工程源文件下载链接

https://download.csdn.net/download/China_Rocky/88293223

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奚永明

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值