【Qt专栏】Qt实现TCP服务端和客户端通信

这篇具有很好参考价值的文章主要介绍了【Qt专栏】Qt实现TCP服务端和客户端通信。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

网络通信是程序员必须会的一项生存技能,这里简单的实现了服务端和客户端通信的两个小示例,代码可以直接拿来用,开发环境是Qt5.9.6。


一、TCP服务端

1.项目架构

qt tcp服务端,Qt,qt,tcp/ip,ui

2.tcpserver.h文件
#ifndef TCPSERVER_H
#define TCPSERVER_H

#include <QWidget>
//添加下面三个头文件,记得在pro文件里添加 network 模块
#include <QTcpServer>
#include <QTcpSocket>
#include <QtNetwork>

namespace Ui {
class TCPServer;
}

class TCPServer : public QWidget
{
    Q_OBJECT

public:
    explicit TCPServer(QWidget *parent = nullptr);
    ~TCPServer();
    void initNetwork(QString ip,quint16 port);
    void stopNetwork();

private slots:
    void    onNewConnection();//QTcpServer的newConnection()信号
    void    onConnected();	//可以不添加该接口
    void    onDisconnected();	//可以不添加该接口
    void    onSocketReadyRead();//读取socket传入的数据

    void on_pushButton_clicked();

private:
    Ui::TCPServer *ui;

    QTcpServer *tcpServer; //TCP服务器
    QTcpSocket *tcpSocket;//TCP通讯的Socket

    QString getLocalIP();//获取本机IP地址
    void    closeEvent(QCloseEvent *event);
};

#endif // TCPSERVER_H
3.tcpserver.cpp文件
#include "tcpserver.h"
#include "ui_tcpserver.h"

TCPServer::TCPServer(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::TCPServer)
{
    ui->setupUi(this);
    initNetwork(getLocalIP(),55555);    //指定ip地址和监听的端口号
}

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

void TCPServer::initNetwork(QString ip, quint16 port)
{
    tcpServer=new QTcpServer(this);
    connect(tcpServer,SIGNAL(newConnection()),this,SLOT(onNewConnection()));

    QHostAddress addr(ip);
    tcpServer->listen(addr,port);
}

void TCPServer::stopNetwork()
{
    if(tcpServer->isListening()){//tcpServer正在监听
        tcpServer->close();;//停止网络监听
    }
}

void TCPServer::onNewConnection()
{
    tcpSocket = tcpServer->nextPendingConnection(); //创建socket
    connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(onSocketReadyRead()));
    connect(tcpSocket, SIGNAL(connected()),this, SLOT(onConnected()));
    onConnected();
    connect(tcpSocket, SIGNAL(disconnected()),this, SLOT(onDisconnected()));
}

void TCPServer::onConnected()
{
    ui->plainTextEdit->appendPlainText(QStringLiteral("***客户端连接 ")
                                       +QStringLiteral("ip地址:")+tcpSocket->peerAddress().toString()
                                       +QStringLiteral(" 端口号:")+QString::number(tcpSocket->peerPort())+"***");
}

void TCPServer::onDisconnected()
{
    ui->plainTextEdit->appendPlainText(QStringLiteral("***客户端断开连接***"));
}


void TCPServer::onSocketReadyRead()
{
    while(tcpSocket->canReadLine()){
        QByteArray msg = tcpSocket->readLine();
        ui->plainTextEdit->appendPlainText("[客户端] "+msg);
    }
}

QString TCPServer::getLocalIP()
{
    QString ipString = Q_NULLPTR;
    QHostInfo hostInfo = QHostInfo::fromName(QHostInfo::localHostName());   //从本地主机名称获取主机信息
    QList<QHostAddress> listAddr = hostInfo.addresses();    //本地主机ip地址列表(IPV4/IPV6)
    foreach (auto addr, listAddr)
    {
       if((addr.isNull() == false) && (addr.protocol() == QAbstractSocket::IPv4Protocol)
               && (addr != QHostAddress::LocalHost))
       {
           ipString = addr.toString();   //根据条件筛选出本地IPV4地址
       }
    }
    return ipString;
}

void TCPServer::closeEvent(QCloseEvent *event)
{
    stopNetwork();
    event->accept();
}

void TCPServer::on_pushButton_clicked()
{
    QString msg = ui->lineEdit->text();
    ui->lineEdit->setFocus();//光标回到lineEdit
    if(msg.isEmpty())return;
    ui->lineEdit->clear();
    ui->plainTextEdit->appendPlainText("[服务端] "+msg);

    QByteArray str = msg.toUtf8();
    str.append("\n");
    tcpSocket->write(str);
}
4.测试效果

qt tcp服务端,Qt,qt,tcp/ip,ui

二、TCP客户端

1.项目架构

qt tcp服务端,Qt,qt,tcp/ip,ui

2.tcpserver.h文件
#ifndef TCPCLIENT_H
#define TCPCLIENT_H

#include <QWidget>
//添加下面两个头文件,记得在pro文件里添加 network 模块
#include    <QTcpSocket>
#include    <QtNetwork>

namespace Ui {
class TCPClient;
}

class TCPClient : public QWidget
{
    Q_OBJECT

public:
    explicit TCPClient(QWidget *parent = nullptr);
    ~TCPClient();
    void initNetwork(QString ip,quint16 port);
    void stopNetwork();

private slots:
//自定义槽函数
    void    onConnected();	//可以不添加该接口
    void    onDisconnected();	//可以不添加该接口
    void    onSocketReadyRead();//读取socket传入的数据

    void on_pushButton_clicked();

private:
    Ui::TCPClient *ui;
    QTcpSocket  *tcpClient;  //socket
    QString getLocalIP();//获取本机IP地址
    void    closeEvent(QCloseEvent *event);
};

#endif // TCPCLIENT_H
3.tcpserver.cpp文件
#include "tcpclient.h"
#include "ui_tcpclient.h"

TCPClient::TCPClient(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::TCPClient)
{
    ui->setupUi(this);
    initNetwork(getLocalIP(),55555);    //指定服务端ip地址和的端口号
}

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

void TCPClient::initNetwork(QString ip, quint16 port)
{
    tcpClient=new QTcpSocket(this); //创建socket变量

    connect(tcpClient,SIGNAL(connected()),this,SLOT(onConnected()));
    connect(tcpClient,SIGNAL(disconnected()),this,SLOT(onDisconnected()));
    connect(tcpClient,SIGNAL(readyRead()),this,SLOT(onSocketReadyRead()));

    tcpClient->connectToHost(ip,port);
}

void TCPClient::stopNetwork()
{
    //断开与服务器的连接
    if (tcpClient->state()==QAbstractSocket::ConnectedState){
        tcpClient->disconnectFromHost();
    }
}

void TCPClient::onConnected()
{
    ui->plainTextEdit->appendPlainText("***已连接到服务器***");
}

void TCPClient::onDisconnected()
{
    ui->plainTextEdit->appendPlainText("***已断开与服务器的连接***");
}

void TCPClient::onSocketReadyRead()
{
    while(tcpClient->canReadLine()){
        QByteArray msg = tcpClient->readLine();
        ui->plainTextEdit->appendPlainText("[服务端] "+msg);
    }
}

QString TCPClient::getLocalIP()
{
    QString ipString = Q_NULLPTR;
    QHostInfo hostInfo = QHostInfo::fromName(QHostInfo::localHostName());   //从本地主机名称获取主机信息
    QList<QHostAddress> listAddr = hostInfo.addresses();    //本地主机ip地址列表(IPV4/IPV6)
    foreach (auto addr, listAddr)
    {
       if((addr.isNull() == false) && (addr.protocol() == QAbstractSocket::IPv4Protocol)
               && (addr != QHostAddress::LocalHost))
       {
           ipString = addr.toString();   //根据条件筛选出本地IPV4地址
       }
    }
    return ipString;
}

void TCPClient::closeEvent(QCloseEvent *event)
{
    stopNetwork();
    event->accept();
}

void TCPClient::on_pushButton_clicked()
{
    //发送数据
    QString  msg=ui->lineEdit->text();
    ui->lineEdit->setFocus();//光标回到lineEdit
    if(msg.isEmpty())return;
    ui->lineEdit->clear();
    ui->plainTextEdit->appendPlainText("[客户端] "+msg);

    QByteArray  str=msg.toUtf8();
    str.append('\n');
    tcpClient->write(str);
}
4.测试效果

qt tcp服务端,Qt,qt,tcp/ip,ui


总结

好了,两个小程序写完并可以运行进行通信,简单的实现,原理后序会专门写篇文章,这里可以直接照着上述写就OK啦,886!文章来源地址https://www.toymoban.com/news/detail-522947.html

到了这里,关于【Qt专栏】Qt实现TCP服务端和客户端通信的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 服务端和客户端通信-TCP(含完整源代码)

    目录 简单TCP通信实验 分析 1、套接字类型 2、socket编程步骤 3、socket编程实现具体思路 实验结果截图 程序代码 实验设备:     目标系统:windows 软件工具:vs2022/VC6/dev 实验要求: 完成TCP服务端和客户端的程序编写; 实现简单字符串的收发功能。 需附上代码及运行结果截图

    2024年02月07日
    浏览(62)
  • SpringBoot搭建Netty+Socket+Tcp服务端和客户端

    yml配置:    完成,启动项目即可自动监听对应端口 这里为了测试,写了Main方法,可以参考服务端,配置启动类 ,实现跟随项目启动   ......想写就参考服务端...... 有测试的,,,但是忘记截图了................

    2024年02月15日
    浏览(43)
  • QT实现tcp服务器客户端

    2024年02月07日
    浏览(42)
  • QT实现TCP通信(服务器与客户端搭建)

    创建一个QTcpServer类对象,该类对象就是一个服务器 调用listen函数将该对象设置为被动监听状态,监听时,可以监听指定的ip地址,也可以监听所有主机地址,可以通过指定端口号,也可以让服务器自动选择 当有客户端发来连接请求时,该服务器会自动发射一个newConnection信号

    2024年02月09日
    浏览(41)
  • C++实现WebSocket通信(服务端和客户端)

    天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。 这里单纯是个人总结,如需更官方更准确的websocket介绍可百度 websocket是一种即时通讯协

    2024年02月09日
    浏览(33)
  • (二) 用QWebSocket 实现服务端和客户端(详细代码直接使用)

    目录 前言 一、服务器的代码: 1、服务器的思路 2、具体服务器的代码示例 二、客户端的代码: 1、客户端的思路(和服务器类似) 2、具体客户端的代码示例 前言         要是想了解QWebSocket的详细知识,还得移步到上一篇文章: WebSocket 详解,以及用QWebSocket 实现服务端

    2024年01月20日
    浏览(33)
  • WebSocket 详解,以及用QWebSocket 实现服务端和客户端(含代码例子)

    目录 前言: 1、WebSocket 诞生背景 2、WebSocket的特点: 3、 WebSocket 简介 4、WebSocket 优点 5、QWebSocket通讯—客户端: 6、QWebSocket通讯—服务端: 前言:         要是对WebSocket 的基本知识都了解了,可以直接移步,实际如何使用这个类 (二) 用QWebSocket 实现服务端和客户端(

    2024年02月16日
    浏览(34)
  • Qt 服务器/客户端TCP通讯

    最近需要用到TCP/IP通讯,这边就先找个简单的例程学习一下。Qt的TCP通讯编程可以使用QtNetwork模块,QtNetwork模块提供的类能够创建基于TCP/IP的客户端与服务端应用程序,一般会使用QTcpSocket、QTcpServer类 网络通信方式主要有两种:TCP与UDP。以下拷贝网络上总结两者之间的区别:

    2023年04月26日
    浏览(57)
  • (一)WebSocket 详解,以及用QWebSocket 实现服务端和客户端(含代码例子)

    目录 前言: 1、WebSocket 诞生背景 2、WebSocket的特点: 3、 WebSocket 简介 4、WebSocket 优点 5、QWebSocket通讯—客户端: 6、QWebSocket通讯—服务端: 前言:         要是对WebSocket 的基本知识都了解了,可以直接移步,实际如何使用这个类 (二) 用QWebSocket 实现服务端和客户端(

    2024年02月03日
    浏览(34)
  • QT TCP客户端实现

    QTcpSocket实例首先是通过connectToHost()尝试连接到服务器,需要指定服务器的IP地址和端口。connectToHost()是异步方式连接服务器,不会阻塞程序运行,连接后发射connected()信号。 如果需要使用阻塞方式连接服务器,则使用waitForConnected()函数阻塞程序运行,直到连接成功或失败。

    2024年02月09日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包