Qt5.14.2实现简单的TCP通信

一、服务端

1.运用UI创建界面如下,并修改对应的objectname。

 

端口port
启动服务器start
通讯记录record
发送数据textlinesend
发送数据senddata

2.头文件

(1).pro文件中加入network

(2)

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

(3)

    QTcpServer *m_s;
    QTcpSocket *m_tcp;
    QLabel *label;

3.源文件

(1)为区别客户端和服务端,单独设置setwindowtitle;

(2)对应变量实例化;

(3)设置端口号:8899(可以任意赋值,但需与客户端保证一致)

(4)

跳转槽函数on_start_clicked():监听

跳转槽函数on_senddata_clicked():数据获取和发送

(5)连接信号与槽

I.基于 QTcpServer::newConnection() 信号检测是否有新的客户端连接
II.如果有新的客户端连接调用 QTcpSocket *QTcpServer::nextPendingConnection() 得到通信的套接字对象
III.使用通信的套接字对象 QTcpSocket 和客户端进行通信(连接为readyread,断开为disconnected)

(6)补充

为方便检验连接状态,在new->Qt->resource file->images中添加图标来判断是否成功连接。

 (7).c代码如下

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    setWindowTitle("服务器");
    m_s=new QTcpServer() ;
    m_tcp=new QTcpSocket();

    ui->port->setText("8899");

    connect(m_s,&QTcpServer::newConnection,this,[=]()
    {
        m_tcp=m_s->nextPendingConnection();

        label->setPixmap(QPixmap(":/no1.png").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();
        label->setPixmap(QPixmap(":/no2.png").scaled(20,20));
    });
    });

    label=new QLabel();
    label->setPixmap(QPixmap(":/no2.png").scaled(20,20));
    ui->statusbar->addWidget(new QLabel("连接状态: "));
    ui->statusbar->addWidget(label);
}

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


void MainWindow::on_start_clicked()
{
    unsigned short port=ui->port->text().toShort();
    m_s->listen(QHostAddress::Any,port);
    ui->start->setDisabled(true);
}


void MainWindow::on_senddata_clicked()
{
    QString msg=ui->send->toPlainText();
    m_tcp->write(msg.toUtf8());
}

 二、客户端

1.运用UI创建界面如下,并修改对应的objectname。

 

端口port
ipIP
连接服务器connect
断开连接disconnect
通讯记录record
发送数据信息栏send
发送数据按钮senddata

2.头文件

(1).pro文件中加入network

(2)

   #include <QTcpSocket>
   #include <QLabel>

(3)

    QTcpSocket *m_tcp;
    QLabel *label;

3.源文件

(1)为区别客户端和服务端,单独设置setwindowtitle;

(2)对应变量实例化,创建通信的套接字类 QTcpSocket 对象m_tcp;

(3)设置端口号:8899(可以任意赋值,但需与客户端保证一致)

         ip地址,本例以本地局域网为准,127.0.0.1

       使用服务器端绑定的 IP 和端口连接服务器 QAbstractSocket::connectToHost()
       使用 QTcpSocket 对象和服务器进行通信

(4)

跳转槽函数void on_connect_clicked(): 与主机进行连接connectToHost 
跳转槽函数void on_disconnect_clicked(): 与主机断开连接close
跳转槽函数void on_senddata_clicked():数据获取和发送

(5)连接信号与槽

  readyread、disconnected、connected

(6)补充

界面中disconnect与connect为互斥关系,故在其一使能时,另一个可以关闭,比如在连接成功后,

        ui->connect->setEnabled(false);
        ui->disconnect->setEnabled(true);

代表连接按钮使能未开启,未连接使能开启,也就是当前为连接状态,在发送数据后只可以断开,不能再重复连接。

(7)代码如下

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    setWindowTitle("客户端");
    ui->IP->setText("127.0.0.1");
    ui->disconnect->setEnabled(true);

    m_tcp=new QTcpSocket(this);

    ui->port->setText("8899");


    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();
        label->setPixmap(QPixmap(":/no2.png").scaled(20,20));
        ui->record->append("服务器已经和客户端断开了连接");
        ui->connect->setEnabled(true);
        ui->disconnect->setEnabled(false);
    });
    connect(m_tcp,&QTcpSocket::connected,this,[=]()
    {

        label->setPixmap(QPixmap(":/no1.png").scaled(20,20));
        ui->record->append("已经成功连接到了服务器");
        ui->connect->setEnabled(false);
        ui->disconnect->setEnabled(true);
    });


    label=new QLabel();
    label->setPixmap(QPixmap(":/no2.png").scaled(20,20));
    ui->statusbar->addWidget(new QLabel("连接状态: "));
    ui->statusbar->addWidget(label);
}

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


void MainWindow::on_connect_clicked()
{
    QString ip=ui->IP->text();
    unsigned short port=ui->port->text().toShort();
    m_tcp->connectToHost(ip,port);
}

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

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

三、运行结果

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值