搭建基于QT的TCP服务器与客户端

1、实现功能

1、服务器和客户端能够建立连接

2、服务器可以给客户端发送信息

3、客户端可以给服务器发送信息

2、server

2-1、widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTcpServer>
#include <QTcpSocket>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
public slots:
    void readData();
private slots:
    void on_send_btn_clicked();

private:
    Ui::Widget *ui;
    QTcpServer *server;
    QTcpSocket *client;
};
#endif // WIDGET_H

2-2、widget.cpp

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //设置一下窗口标题
    this->setWindowTitle("server");
    //实例化服务器对象
    this->server = new QTcpServer(this);
    //创建监听队列并邦定ip和port
    //本地主机ip,端口号为1024~49151
    this->server->listen(QHostAddress("192.168.12.47"), 9999);
    //等待客户端连接,做信号与槽函数关联
    connect(this->server, &QTcpServer::newConnection, this, [=]()
    {
        this->client = this->server->nextPendingConnection();
        //得到了客户端,就可以进行通信
        connect(this->client, &QTcpSocket::readyRead, this, &Widget::readData);
    });
}

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

//从客户端读数据
void Widget::readData()
{
    //从客户端中读数据
    QByteArray data = this->client->readAll();
    //读到的数据添加到recv_edit中
    this->ui->recv_edit->append(data);
}

//给客户端写数据
void Widget::on_send_btn_clicked()
{
    //获取到需要发送给客户端的数据
    QString data = this->ui->send_edit->text();
    //发送给客户端
    this->client->write(data.toUtf8());
    //清空输入框
    this->ui->send_edit->clear();
}

2-3、widget.ui

 

3、client

3-1、widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTcpSocket>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_connect_btn_clicked();
    void on_send_btn_clicked();

public slots:
    void readData();
private:
    Ui::Widget *ui;
    QTcpSocket *client;
    int flag;
    int src_size;
    QByteArray src_data;
};
#endif // WIDGET_H

3-2、widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QHostAddress>
#include <QMessageBox>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    this->setWindowTitle("client");

    this->flag = 0;
    this->src_size = 0;
    this->src_data.clear();

    //实例化客户端套接字对象
    this->client = new QTcpSocket(this);
    //成功连接与否,信号与槽的关联
    connect(this->client, &QTcpSocket::connected, this, [=]()
    {
        QMessageBox::information(this, "提示", "成功建立连接");
    });
    //进行通信,读是被动的,需要做信号与槽关联
    connect(this->client, &QTcpSocket::readyRead, this, &Widget::readData);
}

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

//连接服务器
void Widget::on_connect_btn_clicked()
{
    //获取ip和port
    QString ip = this->ui->ip_edit->text();
    uint port = this->ui->port_edit->text().toUInt();
    //连接服务器
    this->client->connectToHost(QHostAddress(ip), port);
}

//从客户端读数据
void Widget::readData()
{
//    //从客户端中读数据
//    QByteArray data = this->client->readAll();
//    //读到的数据添加到recv_edit中
//    this->ui->recv_edit->append(data);
    char buf[256] = {0};
    if(this->flag == 0)
    {
        this->client->read(buf, 256);  //FILE_SIZE#文件大小
        QStringList info = QString(buf).split("#");
        if(info.front() == "FILE_SIZE")
        {
             //获取到图片文件的大小
             this->src_size = info.back().toInt();
             this->flag = 1;
        }
    }
    else if(this->flag == 1) //开始接收真正的图像数据
    {
         QByteArray data = this->client->readAll();
         //保存下来
         this->src_data.append(data);
         if(this->src_data.size() == this->src_size)
         {
              //下载成功
              QPixmap pix;
              pix.loadFromData(this->src_data);
              this->ui->label->setPixmap(pix.scaled(this->ui->label->size()));
              this->flag = 0;
              this->src_size = 0;
              this->src_data.clear();
         }
    }
}

//给客户端写数据
void Widget::on_send_btn_clicked()
{
    //获取到需要发送给客户端的数据
    QString data = this->ui->send_edit->text();
    //发送给客户端
    this->client->write(data.toUtf8());
    //清空输入框
    this->ui->send_edit->clear();
}

3-3、widget.ui

  • 9
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在使用Qt搭建服务器客户端来实现直播功能时,主要需要以下几个步骤: 1. 服务器端的搭建:首先,需要通过Qt创建一个服务器应用程序,为客户端提供直播数据流的传输。使用Qt的网络库类,如QTcpServer和QTcpSocket,可以实现对服务器的监听和接受客户端连接请求的功能。服务器端还需使用Qt的多线程类,如QThread,来处理多个客户端连接和直播数据的发送。 2. 客户端搭建:通过Qt创建一个客户端应用程序,用于接收服务器端传来的直播数据流并进行播放。使用Qt的网络库类,如QTcpSocket,客户端能够连接服务器,并接受直播数据流。客户端还可以使用Qt的多媒体类,如QMediaPlayer,来播放从服务器传来的直播数据。 3. 直播数据的传输:一般使用TCP协议来传输直播数据。服务器端将直播数据通过TCP socket发送给已连接的客户端,而客户端则通过TCP socket接收和解析这些数据,并使用多媒体类来播放直播内容。 4. 直播功能的实现:根据需求,还可以在程序中加入一些附加功能,例如客户端的聊天室、礼物赠送、直播间管理等功能。这些功能可以通过Qt的信号与槽机制、套接字通信及数据库的操作等方式来实现。 总体而言,通过使用Qt的网络库类和多媒体类,可以较为方便地搭建服务器客户端来实现直播功能。在搭建过程中,需要注意处理多个连接和数据流传输的并发性,同时也需要考虑网络稳定性和性能优化等因素。 ### 回答2: 搭建服务器客户端来实现直播,我们可以使用Qt网络模块来实现。 首先,在服务器端,我们需要创建一个TCP服务器。我们可以使用`QTcpServer`类来创建一个服务器,然后使用`listen`函数指定服务器的地址和端口号。当有客户端连接到服务器时,服务器会自动调用`newConnection`信号槽。 在`newConnection`槽函数中,我们可以创建一个`QTcpSocket`对象来处理与客户端的通信。我们可以使用`write`函数向客户端发送直播数据,例如视频流。同时,我们还可以使用`readyRead`信号槽来接收客户端发送的消息或命令。 在客户端,我们需要创建一个TCP客户端来连接到服务器。我们可以使用`QTcpSocket`类来创建一个客户端,然后使用`connectToHost`函数指定服务器的地址和端口号。当成功连接到服务器后,我们可以使用`connected`信号槽来进行后续操作。 在客户端中,我们可以使用`readyRead`信号槽来接收服务器发送的直播数据。我们还可以使用`write`函数向服务器发送消息或命令。 当我们的服务器客户端完成基本的连接和通信设置后,我们可以在服务器端使用多线程来处理多个客户端的连接和直播数据的传输。这样,我们就可以实现多个客户端同时观看直播。 总结起来,通过使用Qt的网络模块,我们可以搭建一个简单的服务器客户端系统来实现直播功能。服务器端负责接收客户端连接,并发送直播数据,而客户端则负责连接服务器并接收直播数据。这样我们就可以实现通过搭建服务器客户端来实现直播的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值