Qt 的TCP网络通信

 

Qt网络通信:

Socket 通信:

Qt 中提供的所有的 Socket 类都是非阻塞的。

Qt 中常用的用于Socket 通信的套接字类

QTCPServer:用于TCP/IP 通信,作为服务器端套接字使用。

QTCPSocket:用于TCP/IP 通信,作为客户端套接字使用。

QUDPSocket:用于UDP通信,服务器,客户端均使用此套接字。

 

TCP/IP:

在Qt 中实现TCP/IP 服务器端通信的流程:

(1)创建套接字;(2)将套接字设置为监听模式;(3)等待并接受客户的需求;[可以通过QTCPServer 提供的void newConnection() 信号来检测是否有连接请求,如果有可以在对应的槽函数中调用nextPendingconnection()函数获取到客户端的Socket 信息(返回值为QTCPSocket*类型指针),通过此套接字与客户端之间进行通信。];(3)接收或者向客户端发送数据 [① 接收数据:使用read() 或者readAll() 函数;② 发送数据:使用write()函数]

客户端通信流程:

(1)创建套接字;(2)连接服务器 [可以使用QTCPSocket 类的connectionToHost() 函数来连接服务器];(3)向服务器发送或者接收数据

在开始之前 ServerTCP.pro:(项目名称为ServerTCP)

添加如下代码:

服务器端:

添加Client 客户端的文件:

右键项目名称 -> 添加新文件 -> 

客户端:

在服务器端和客户端的textEditRead 栏中将其设置为 “只读”

服务器端:

点击ui的Send 和Close的按钮:右键 -> 转到槽;

客户端:

点击ui的Send 、Close和 connect的按钮:右键 -> 转到槽;

 

代码段:

服务器:

Serverwidget.h

#ifndef SERVERWIDGET_H
#define SERVERWIDGET_H

#include <QWidget>
#include <QTcpServer> //监听套接字
#include <QTcpSocket> //通信套接字

#include <QMouseEvent>
namespace Ui {
class ServerWidget;
}

class ServerWidget : public QWidget
{
    Q_OBJECT

public:
    explicit ServerWidget(QWidget *parent = 0);
    ~ServerWidget();
protected:
    void paintEvent(QPaintEvent *event);

private slots:
    void on_send_clicked();

    void on_close_clicked();

private:
    Ui::ServerWidget *ui;

    QTcpServer *tcpServer;//监听套接字
    QTcpSocket *tcpSocket;//通信套接字

};

#endif // SERVERWIDGET_H

 

Serverwidget.cpp

#include "serverwidget.h"
#include "ui_serverwidget.h"
#include <QPainter>

ServerWidget::ServerWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::ServerWidget)
{
    ui->setupUi(this);
    tcpServer = NULL;
    tcpSocket = NULL;

    setWindowTitle("服务器端");
    //监听套接字,指定父对象,让其自动回收空间
    tcpServer = new QTcpServer(this);
    tcpServer->listen(QHostAddress::Any,666);
    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,
                        [=]()
                        {
                            //从通信套接字中取出内容
                            QByteArray array = tcpSocket->readAll();
                            ui->textEditRead->append(array);
                        }
                        );
            }
            );

}

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

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


void ServerWidget::on_close_clicked()
{
    //主动和客户端断开连接
    if(NULL == tcpSocket)
    {
        return;
    }
    tcpSocket->disconnectFromHost();
    tcpSocket->close();
    tcpSocket = NULL;
}
void ServerWidget::paintEvent(QPaintEvent *event)
{
    QPainter p(this);
    p.drawPixmap(0,0,width(),height(),QPixmap(":/new/prefix1/Image/1.jpg"));
}

客户端:

clientwidget.h

#ifndef CLIENWIDGET_H
#define CLIENWIDGET_H

#include <QWidget>
#include <QTcpSocket>//通信套接字

namespace Ui {
class ClienWidget;
}

class ClienWidget : public QWidget
{
    Q_OBJECT

public:
    explicit ClienWidget(QWidget *parent = 0);
    ~ClienWidget();
protected:
    void paintEvent(QPaintEvent *event);

private slots:
    void on_pushButtonConnect_clicked();

    void on_pushButtonSend_clicked();

    void on_pushButtonClose_clicked();

private:
    Ui::ClienWidget *ui;
    QTcpSocket *tcpsocket;//通信套接字
};

#endif // CLIENWIDGET_H

clientwidget.cpp

#include "clienwidget.h"
#include "ui_clienwidget.h"
#include <QHostAddress>
#include <QPainter>
ClienWidget::ClienWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::ClienWidget)
{
    ui->setupUi(this);

    ui->textEditRead->setStyleSheet("background-image:url(:/new/prefix1/Image/5C74F1D9198348410F91F4EA3EAD6FB2.jpg);");
    ui->textEditWrite->setStyleSheet("background-image:url(:/new/prefix1/Image/8A141585F1E8C5BD63F80D15DB9826E2.jpg)");

    tcpsocket = NULL;

    //分配空间,指定父对象
    tcpsocket = new QTcpSocket(this);
    setWindowTitle("客户端");

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

            }
            );
    connect(tcpsocket,&QTcpSocket::readyRead,
            [=]()
            {
                //获取对方发送的内容
                QByteArray array = tcpsocket->readAll();
                //追加到编辑区中
                ui->textEditRead->append(array);
            }
            );

}

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



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

void ClienWidget::on_pushButtonSend_clicked()
{
    //获取编辑框内容
    QString str = ui->textEditWrite->toPlainText();
    //发送数据
    tcpsocket->write(str.toUtf8().data());
}

void ClienWidget::on_pushButtonClose_clicked()
{
    //主动和对方断开连接
    tcpsocket->disconnectFromHost();
    tcpsocket->close();
}

void ClienWidget::paintEvent(QPaintEvent *event)
{
    QPainter p(this);
    p.drawPixmap(0,0,width(),height(),QPixmap(":/new/prefix1/Image/bk.jpg"));
}

 

添加资源:

右击项目 -> 添加新文件 -> 

项目会出现 Resources -> image.qrc 右击 -> open in Editor

效果:

点击连接后:

课外了解

Qt TCP 网络通信的结构:

 

 

  • 16
    点赞
  • 87
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: qt tcp通信v2.zip是一个Qt程序文件,用于实现TCP通信功能。 Qt是一个跨平台的C++应用程序开发框架,可以方便地开发图形用户界面(GUI)和网络通信功能。TCP是一种可靠的传输协议,常用于实现网络通信qt tcp通信v2.zip包含了一个示例程序,是基于Qt框架的TCP通信的实现。它可能包含了与网络通信相关的源代码文件、二进制可执行文件、配置文件等资源。 使用Qt进行TCP通信,可以方便地进行客户端和服务器端之间的数据传输。通过TCP协议,可以建立可靠的连接,实现稳定的数据传输。在Qt的API中,提供了一些类和函数,可以方便地创建TCP服务器和客户端,进行数据传输和接收。 使用qt tcp通信v2.zip,我们可以学习如何在Qt框架的基础上,实现TCP通信的功能。可以学习如何创建一个简单的TCP服务器,监听指定端口,并接收客户端的连接请求。也可以学习如何创建一个TCP客户端,与服务器建立连接,并向服务器发送数据。 通过学习qt tcp通信v2.zip,我们可以了解Qt框架的网络编程能力,学习如何使用Qt进行网络通信的开发。这对于需要实现网络通信功能的应用程序开发来说,是非常有帮助的。 ### 回答2: "qt tcp通信v2.zip"是一个文件压缩包,它包含了关于QT框架下TCP通信的相关实例代码和资源。 QT是一个跨平台的C++应用程序开发框架,它提供了丰富的功能和工具,用于开发图形用户界面和网络应用程序等。而TCP通信是一种面向连接的网络通信协议,它可以在不同的设备之间进行可靠的数据传输。 在这个文件压缩包中,我们可以找到一些用QT框架实现TCP通信的示例代码,这些代码可以帮助开发人员理解和掌握TCP通信的基本原理和操作。此外,压缩包还可能包含一些必要的资源文件,如图标、配置文件等,以帮助使用者更方便地开发和测试应用程序。 要使用这个文件压缩包,我们首先需要解压缩它。解压后,我们可以使用QT开发环境打开这些示例代码,通过阅读和分析代码,了解QT框架如何实现TCP通信的功能。 同时,我们还可以基于这些示例代码进行修改和扩展,根据自己的需求开发更复杂和功能强大的TCP通信应用程序。 总之,"qt tcp通信v2.zip"是一个提供QT框架下TCP通信实例代码和资源的文件压缩包,通过使用它,我们可以学习和应用QT框架的TCP通信功能。 ### 回答3: "qt tcp通信v2.zip"是一个用于实现Qt TCP通信的代码文件压缩包。Qt是一种跨平台的应用程序开发框架,它提供了丰富的类库和工具,用于开发图形界面和网络应用程序等。 该压缩包中的代码主要涉及TCP通信的功能实现。TCP(传输控制协议)是一种面向连接的可靠的数据传输协议,常用于在计算机网络中实现数据通信Qt提供了用于创建TCP套接字(socket)的类库,并包含了一些常用的通信函数和信号槽机制,用于发送和接收数据。这个压缩包中的代码文件应该包含了使用Qt实现TCP通信的必要函数和类。 通过使用这个压缩包中的代码,我们可以利用Qt提供的TCP套接字类库,完成两台计算机之间的数据传输。比如,可以实现一个客户端和服务器端的通信,或者两台客户端之间的通信Qt TCP通信v2.zip提供了一个简单方便的方式来构建和管理TCP连接,并实现数据的发送和接收。用户可以根据自己的需求,修改和扩展这些代码,以满足特定的通信需求。 总之,Qt TCP通信v2.zip是一个包含用于实现Qt TCP通信的代码文件压缩包,可以帮助开发者轻松地在Qt框架下实现TCP通信的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值