前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用QT实现简单的tcp/ip通信

使用QT实现简单的tcp/ip通信

作者头像
Sindsun
发布2019-12-06 17:48:13
4.1K0
发布2019-12-06 17:48:13
举报
文章被收录于专栏:狂码一生狂码一生

使用QT实现tcp/ip的通信非常的简单,下面我将直接贴出代码:

一、服务器端

1、头文件

代码语言:javascript
复制
#ifndef SERVERWIDGET_H
#define SERVERWIDGET_H

#include <QWidget>

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

namespace Ui {
class ServerWidget;
}

class ServerWidget : public QWidget
{
    Q_OBJECT

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

private slots:
    void on_buttonSend_clicked();

    void on_buttonClose_clicked();

private:
    Ui::ServerWidget *ui;

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

#endif // SERVERWIDGET_H

2、cpp文件

代码语言:javascript
复制
#include "serverwidget.h"
#include "ui_serverwidget.h"


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

    //初始化套接字指针
    tcpServer = NULL;
    tcpSocket = NULL;

    setWindowTitle("服务器:8899");
    //监听套接字,指定父对象,让其自动回收空间
    this->tcpServer = new QTcpServer(this);
    //监听客户端的请求
    this->tcpServer->listen(QHostAddress::Any,8899);
    connect(this->tcpServer, &QTcpServer::newConnection, [=](){
        //取出建立好链接的套接字
        this->tcpSocket = this->tcpServer->nextPendingConnection();
        //获取对方的IP和端口
        QString userIp = this->tcpSocket->peerAddress().toString();
        qint16 userPort = this->tcpSocket->peerPort();
        QString temp = QString("[%1:%2]:连接成功").arg(userIp).arg(userPort);
        ui->textEditRead->setText(temp);

        //接收数据
        connect(this->tcpSocket,&QTcpSocket::readyRead,[=](){
            //从通信套接字中取出内容
            QByteArray array = tcpSocket->readAll();
            ui->textEditRead->append(array);
        });
    });
}

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

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

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

二、客户端

1、头文件

代码语言:javascript
复制
#ifndef CLIENTWIDGET_H
#define CLIENTWIDGET_H

#include <QWidget>

#include <QTcpSocket>

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_buttonSend_clicked();

    void on_buttonClose_clicked();

private:
    Ui::ClientWidget *ui;

    //通信套接字
    QTcpSocket *tcpSocket;
};

#endif // CLIENTWIDGET_H

2、cpp文件

代码语言:javascript
复制
#include "clientwidget.h"
#include "ui_clientwidget.h"

#include <QHostAddress>

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

    setWindowTitle("客户端");

    //初始化套接字
    tcpSocket = NULL;
    //分配空间,指定父对象
    tcpSocket = new QTcpSocket(this);
    //建立连接
    connect(tcpSocket,&QTcpSocket::connected,[=](){
        ui->textEditRead->setText("连接服务器成功");
    });
    //接收数据
    connect(tcpSocket,&QTcpSocket::readyRead,[=](){
        //获取对方发送的内容
        QByteArray array = tcpSocket->readAll();
        //追加到编辑区中
        ui->textEditRead->append(array);
    });
}

ClientWidget::~ClientWidget()
{
    delete ui;
}
//连接服务器
void ClientWidget::on_buttonConnect_clicked()
{
    if(tcpSocket != NULL){
        return;
    }
    //获取服务器IP和端口
    QString ip = ui->lineEditIp->text();
    qint16 port = ui->lineEditPort->text().toInt();
    //主动和服务器建立链接
    tcpSocket->connectToHost(QHostAddress(ip),port);
}
//发送数据
void ClientWidget::on_buttonSend_clicked()
{
    if(tcpSocket == NULL){
        return;
    }
    //获取编辑框内容
    QString str = ui->textEditWrite->toPlainText();
    //发送数据
    tcpSocket->write(str.toUtf8().data());
}
//断开与服务器的连接
void ClientWidget::on_buttonClose_clicked()
{
    if(tcpSocket == NULL){
        return;
    }
    tcpSocket->disconnectFromHost();
    tcpSocket->close();
}

三、实现效果图如下(程序中对应的控件对象名在下面可以直接对照,控件不多,就不一一列出来了):

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-09-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档