QT网络编程之实现TCP客户端和服务端

推荐一个不错的人工智能学习网站,通俗易懂,内容全面,作为入门科普和学习提升都不错,分享一下给大家:前言icon-default.png?t=N7T8https://www.captainbed.cn/ai

一.QT5.12实现TCP客户端和服务功能

1.QT中实现TCP通信主要用到了以下类:QTcpServer、QTcpSocket、QHostAddress

2.基本流程:

使用QTcpServer来创建一个TCP服务器,在新的连接建立时,将新建立连接的socket添加到列表中,以便发送数据,同时监听在指定的IP地址和端口上,并在有新的客户端连接上来时进行处理;

使用QTcpSocket来创建一个TCP客户端,连接到服务器并发送数据;

二.代码示例

1.mainwindow.h

#ifndef MAINWINDOW_H

#define MAINWINDOW_H

#include <QMainWindow>

#include    <QTcpServer>

#include    <QLabel>

namespace Ui {

class MainWindow;

}

class MainWindow : public QMainWindow

{

    Q_OBJECT

private:

    QLabel  *LabListen;//状态栏标签

    QLabel  *LabSocketState;//状态栏标签

    QTcpServer *tcpServer; //TCP服务器

    QTcpSocket *tcpSocket;//TCP通讯的Socket

    QString getLocalIP();//获取本机IP地址

protected:

    void    closeEvent(QCloseEvent *event);

public:

    explicit MainWindow(QWidget *parent = 0);

    ~MainWindow();

private slots:

//自定义槽函数

    void    onNewConnection();//QTcpServer的newConnection()信号

    void    onSocketStateChange(QAbstractSocket::SocketState socketState);

    void    onClientConnected(); //Client Socket connected

    void    onClientDisconnected();//Client Socket disconnected

    void    onSocketReadyRead();//读取socket传入的数据

//UI生成的

    void on_actStart_triggered();

    void on_actStop_triggered();

    void on_actClear_triggered();

    void on_btnSend_clicked();

    void on_actHostInfo_triggered();

private:

    Ui::MainWindow *ui;

};

#endif // MAINWINDOW_H

2.mainwindow.cpp

#include "mainwindow.h"

#include "ui_mainwindow.h"

#include    <QtNetwork>

QString MainWindow::getLocalIP()

{//获取本机IPv4地址

    QString hostName=QHostInfo::localHostName();//本地主机名

    QHostInfo   hostInfo=QHostInfo::fromName(hostName);

    QString   localIP="";

    QList<QHostAddress> addList=hostInfo.addresses();//

    if (!addList.isEmpty())

    for (int i=0;i<addList.count();i++)

    {

        QHostAddress aHost=addList.at(i);

        if (QAbstractSocket::IPv4Protocol==aHost.protocol())

        {

            localIP=aHost.toString();

            break;

        }

    }

    return localIP;

}

void MainWindow::closeEvent(QCloseEvent *event)

{//关闭窗口时停止监听

    if (tcpServer->isListening())

        tcpServer->close();;//停止网络监听

    event->accept();

}

MainWindow::MainWindow(QWidget *parent) :

    QMainWindow(parent),

    ui(new Ui::MainWindow)

{

    ui->setupUi(this);

    LabListen=new QLabel("监听状态:");

    LabListen->setMinimumWidth(150);

    ui->statusBar->addWidget(LabListen);

    LabSocketState=new QLabel("Socket状态:");//

    LabSocketState->setMinimumWidth(200);

    ui->statusBar->addWidget(LabSocketState);

    QString localIP=getLocalIP();//本机IP

    this->setWindowTitle(this->windowTitle()+"----本机IP:"+localIP);

    ui->comboIP->addItem(localIP);

    tcpServer=new QTcpServer(this);

    connect(tcpServer,SIGNAL(newConnection()),this,SLOT(onNewConnection()));

}

MainWindow::~MainWindow()

{

    delete ui;

}

void MainWindow::onNewConnection()

{

//    ui->plainTextEdit->appendPlainText("有新连接");

    tcpSocket = tcpServer->nextPendingConnection(); //创建socket

    connect(tcpSocket, SIGNAL(connected()),

            this, SLOT(onClientConnected()));

    onClientConnected();//

    connect(tcpSocket, SIGNAL(disconnected()),

            this, SLOT(onClientDisconnected()));

    connect(tcpSocket,SIGNAL(stateChanged(QAbstractSocket::SocketState)),

            this,SLOT(onSocketStateChange(QAbstractSocket::SocketState)));

    onSocketStateChange(tcpSocket->state());

    connect(tcpSocket,SIGNAL(readyRead()),

            this,SLOT(onSocketReadyRead()));

}

void MainWindow::onSocketStateChange(QAbstractSocket::SocketState socketState)

{//socket状态变化时

    switch(socketState)

    {

    case QAbstractSocket::UnconnectedState:

        LabSocketState->setText("scoket状态:UnconnectedState");

        break;

    case QAbstractSocket::HostLookupState:

        LabSocketState->setText("scoket状态:HostLookupState");

        break;

    case QAbstractSocket::ConnectingState:

        LabSocketState->setText("scoket状态:ConnectingState");

        break;

    case QAbstractSocket::ConnectedState:

        LabSocketState->setText("scoket状态:ConnectedState");

        break;

    case QAbstractSocket::BoundState:

        LabSocketState->setText("scoket状态:BoundState");

        break;

    case QAbstractSocket::ClosingState:

        LabSocketState->setText("scoket状态:ClosingState");

        break;

    case QAbstractSocket::ListeningState:

        LabSocketState->setText("scoket状态:ListeningState");

    }

}

void MainWindow::onClientConnected()

{//客户端接入时

    ui->plainTextEdit->appendPlainText("**client socket connected");

    ui->plainTextEdit->appendPlainText("**peer address:"+

                                   tcpSocket->peerAddress().toString());

    ui->plainTextEdit->appendPlainText("**peer port:"+

                                   QString::number(tcpSocket->peerPort()));

}

void MainWindow::onClientDisconnected()

{//客户端断开连接时

    ui->plainTextEdit->appendPlainText("**client socket disconnected");

    tcpSocket->deleteLater();

    //    deleteLater();//QObject::deleteLater();

}

void MainWindow::onSocketReadyRead()

{//读取缓冲区行文本

//    QStringList   lines;

    while(tcpSocket->canReadLine())

        ui->plainTextEdit->appendPlainText("[in] "+tcpSocket->readLine());

//        lines.append(clientConnection->readLine());

}

void MainWindow::on_actStart_triggered()

{//开始监听

    QString     IP=ui->comboIP->currentText();//IP地址

    quint16     port=ui->spinPort->value();//端口

    QHostAddress    addr(IP);

    tcpServer->listen(addr,port);//

    ui->plainTextEdit->appendPlainText("**开始监听...");

    ui->plainTextEdit->appendPlainText("**服务器地址:"

                       +tcpServer->serverAddress().toString());

    ui->plainTextEdit->appendPlainText("**服务器端口:"

                       +QString::number(tcpServer->serverPort()));

    ui->actStart->setEnabled(false);

    ui->actStop->setEnabled(true);

    LabListen->setText("监听状态:正在监听");

}

void MainWindow::on_actStop_triggered()

{//停止监听

    if (tcpServer->isListening()) //tcpServer正在监听

    {

        tcpServer->close();//停止监听

        ui->actStart->setEnabled(true);

        ui->actStop->setEnabled(false);

        LabListen->setText("监听状态:已停止监听");

    }

}

void MainWindow::on_actClear_triggered()

{

    ui->plainTextEdit->clear();

}

void MainWindow::on_btnSend_clicked()

{//发送一行字符串,以换行符结束

    QString  msg=ui->editMsg->text();

    ui->plainTextEdit->appendPlainText("[out] "+msg);

    ui->editMsg->clear();

    ui->editMsg->setFocus();

    QByteArray  str=msg.toUtf8();

    str.append('\n');//添加一个换行符

    tcpSocket->write(str);

}

void MainWindow::on_actHostInfo_triggered()

{//获取本机地址

    QString hostName=QHostInfo::localHostName();//本地主机名

    ui->plainTextEdit->appendPlainText("本机主机名:"+hostName+"\n");

    QHostInfo   hostInfo=QHostInfo::fromName(hostName);

    QList<QHostAddress> addList=hostInfo.addresses();//

    if (!addList.isEmpty())

    for (int i=0;i<addList.count();i++)

    {

        QHostAddress aHost=addList.at(i);

        if (QAbstractSocket::IPv4Protocol==aHost.protocol())

        {

            QString IP=aHost.toString();

            ui->plainTextEdit->appendPlainText("本机IP地址:"+aHost.toString());

            if (ui->comboIP->findText(IP)<0)

                ui->comboIP->addItem(IP);

        }

    }

}

三.测试结果

  • 21
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

AI+程序员在路上

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

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

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

打赏作者

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

抵扣说明:

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

余额充值