Qt TCP实现简单通信功能

作者:xundao_803817 时间:2021-07-07 02:16:30 

本文实例为大家分享了Qt TCP实现简单通信的具体代码,供大家参考,具体内容如下

在.pro文件中添加网络模块 Qt += network

服务端:

1. 创建QTcpServer 对象,用于监听,创建套接字等;

QTcpServer * serverSocket = new QTcpServer(this);

2.进行监听,通过QTcpServer对象 QTcpServer::listen();

bool listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0);

例子:

// 获取单行输入框输入的数为端口号
short port = ui->lineEdit->text().toInt();
tcpServer->listen(QHostAddress::Any, port); // QHostAddress::Any表示自动绑定

3.使用信号槽,connect(), 判断是否有客户端来连接,QTcpServer::newConnection();

[signal] void QTcpServer::newConnection()

例子:

// 3.基于 QTcpServer::newConnection() 信号检测是否有新客户端连接
connect(tcpServer, &QTcpServer::newConnection, this, [=]()
? ? {
? ? ? ? // 创建用于通信的套接字
? ? ? ? // 4.如果有新的客户端连接调用 QTcpSocket* QTcpServer::nextPendingConnection()
? ? ? ? // 在通信编辑框中显示成功与客户端取得连接
? ? ? ? // 5.准备与客户端通信
? ? ? ? // 6.判断客户端是否断开连接 ? ?
? ? });

4.在步骤3的基础上,创建套接字,QTcpSocket socketServer = QTcpServer::nextPendingConnection();

5.在步骤3的基础上,使用信号槽connect(),判断是否接收客户端发了 的信息QTcpSocket::readyRead();

6. 在步骤5的基础上,通过套接字调用readAll() ,读取客户端发来的信息;

7.在步骤3的基础上,通过套接字判断客户端是否下线,关闭套接字;

客户端:

1. 创建套接字对象,用于通信 QTcpSocket *clientSocket = new QTcpSocket(this);

2. 调用信号槽,connect() ,判断是否成功连接服务端connected;

3. 调用信号槽,connect() , 判断是否接受来着服务端发来的信息 readyRead();

4. 在步骤3的基础上,利用套接字对象调用readAll() 方法,读取服务端发来的消息;

5. 利用套接字调用write() 方法,将消息发送给服务端;

6. 调用信号槽,connect() , 判断是否断开连接,释放套接字;

服务端代码:

MainWindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
?
#include "QDebug"
#include <QMessageBox>
?
MainWindow::MainWindow(QWidget *parent) :
? ? QMainWindow(parent),
? ? ui(new Ui::MainWindow)
{
? ? ui->setupUi(this);
?
? ? // 设置窗口名称
? ? setWindowTitle(QString("Server-TCP"));
? ? setWindowIcon(QIcon(QPixmap("D:\\BaiduNetdiskDownload\\Res WWW\\picture\\ico\\01_副本.png")));
?
? ? // 刚进来是将连接状态图片置成灰色的
? ? m_pixmap.load(QString("D:\\BaiduNetdiskDownload\\Res WWW\\picture\\ico\\01_副本_副本.png"));
?
? ? // 2.socket 通信
? ? //tcpSocket = new QTcpSocket();
? ? // 获取套接字
? ? // 服务端通信流程
? ? // 1.创建套接字服务器 QTcpServer对象
? ? tcpServer = new QTcpServer(this);
? ? // 2.通过QTcpServer对象设置监听,即QTcpServer::listen()
? ? // 3.基于 QTcpServer::newConnection() 信号检测是否有新客户端连接
? ? connect(tcpServer, &QTcpServer::newConnection, this, [=]()
? ? {
? ? ? ? // 成功连接则切换图片颜色
? ? ? ? m_pixmap.load(QString("D:\\BaiduNetdiskDownload\\Res WWW\\picture\\ico\\01_副本.png"));
?
? ? ? ? // 创建用于通信的套接字
? ? ? ? // 4.如果有新的客户端连接调用 QTcpSocket* QTcpServer::nextPendingConnection()
? ? ? ? tcpSocket = tcpServer->nextPendingConnection();
? ? ? ? // 在通信编辑框中显示成功与客户端取得连接
? ? ? ? ui->textEdit->append("成功与客户端取得连接!!!");
? ? ? ? // 5.准备与客户端通信
? ? ? ? connect(tcpSocket, &QTcpSocket::readyRead, this, [=]()
? ? ? ? {
? ? ? ? ? ? // 调用套接字读取客户端发的数据
? ? ? ? ? ? QString acceptText = tcpSocket->readAll(); // QByteArray 可以强制转成 QString
? ? ? ? ? ? // 将读取到的数据写到通信编辑框中
? ? ? ? ? ? ui->textEdit->append("客户端say:" + acceptText);
? ? ? ? });
?
? ? ? ? // 6.判断客户端是否断开连接
? ? ? ? connect(tcpSocket, &QTcpSocket::disconnected, this, [=]()
? ? ? ? {
? ? ? ? ? ? //QMessageBox(, QMessageBox::Warning, );
? ? ? ? ? ? QMessageBox::warning(this, "连接状态", "客户端已断开连接");
? ? ? ? ? ? tcpSocket->deleteLater();
? ? ? ? ? ? // 将连接状态图片置成灰色的
? ? ? ? ? ? m_pixmap.load(QString("D:\\BaiduNetdiskDownload\\Res WWW\\picture\\ico\\01_副本_副本.png"));
?
? ? ? ? ? ? //tcpServer->deleteLater();
? ? ? ? });
?
? ? });
?
? ? // 1.状态栏显示信息
? ? showMessageStatusBar();
}
?
MainWindow::~MainWindow()
{
? ? delete ui;
}
?
// 状态栏添加提示信息
void MainWindow::showMessageStatusBar()
{
? ? // 设置窗口名称
? ? //QWidget::windowTitleChanged("Server-TCP");
? ? //ui->statusBar->setWindowTitle();
?
? ? // 通过加载QLable给状态栏显示文本
? ? QLabel *pLable = new QLabel();
? ? QLabel *lableText = new QLabel(QString::fromUtf8("连接状态:"));
?
? ? //lableText->setAlignment(Qt::AlignLeft | Qt::AlignVCenter);
? ? //pLable->setMinimumWidth(this->width()/2);
?
? ? //= new QLabel(QString::fromUtf8("连接状态:"));
? ? // 设置lable标签的大小
? ? //pLable->setMinimumSize(pLable->sizeHint());
? ? pLable->setFixedSize(30, 30);
?
? ? m_pixmap.scaled(pLable->width(), pLable->height());
? ? // 显示图片
? ? pLable->setPixmap(m_pixmap);
? ? // 按比例缩小图片
?
? ? //pLable->setFixedSize(QSize(50,50));
? ? // 设置状态栏样式
? ? //ui->statusBar->setStyleSheet(QString("QString::item{border:0px")); ?// 不显示边框
? ? // 将标签加入到状态栏中
? ? ui->statusBar->addWidget(lableText);
? ? ui->statusBar->addPermanentWidget(pLable);//
}
?
// 处理点击启动服务器,进行监听
void MainWindow::on_pushButton_clicked()
{
? ? //qDebug() << "点击了 启动服务器按钮\n";
? ? // 获取输入框输入的数为端口号
? ? short port = ui->lineEdit->text().toInt();
? ? tcpServer->listen(QHostAddress::Any, port);
}
?
// 将数据发生给客户端
void MainWindow::on_pushButton_2_clicked()
{
? ? // 将发送数据编辑栏的文本通过套接字发生给客户端
? ? tcpSocket->write(ui->textEdit_2->toPlainText().toUtf8());
? ? // 需要将要发生的数据写到通信编辑栏中
? ? ui->textEdit->append("服务端say:" + ui->textEdit_2->toPlainText().toUtf8());
? ? // 清空发送消息编辑框
? ? ui->textEdit_2->clear();
}

mainWindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
?
#include <QMainWindow>
#include <QTcpServer>
#include <QTcpSocket>
?
?
namespace Ui {
class MainWindow;
}
?
class MainWindow : public QMainWindow
{
? ? Q_OBJECT
?
public:
? ? explicit MainWindow(QWidget *parent = nullptr);
? ? ~MainWindow();
?
? ? // 在状态栏中设置文本+图标
? ? void showMessageStatusBar();
?
? ? QTcpServer* tcpServer;
? ? QTcpSocket* tcpSocket;
?
private slots:
? ? void on_pushButton_clicked();
?
? ? void on_pushButton_2_clicked();
?
private:
? ? Ui::MainWindow *ui;
? ? // 用于加载图片路径
? ? QPixmap m_pixmap;
};
?
#endif // MAINWINDOW_H

程序UI

Qt TCP实现简单通信功能

客户端:

client.cpp

#include "client.h"
#include "ui_client.h"
?
Client::Client(QWidget *parent) :
? ? QMainWindow(parent),
? ? ui(new Ui::Client)
{
? ? ui->setupUi(this);
?
? ? // 通信流程
? ? //1、创建套接字对象
? ? clientSocket = new QTcpSocket(this);
? ? //2、调用QTcpSocket::connectToHost() 绑定服务端IP和端口
?
? ? //3、通过套接字与服务端进行通信 收发
? ? // 判断是否成功连接服务端 开始读取服务端发来的信息
? ? connect(clientSocket, &QTcpSocket::readyRead, this, [=]()
? ? {
? ? ? ? // 通过套接字读取发来的信息
? ? ? ? QByteArray receiveAll = clientSocket->readAll();
? ? ? ? // 将获取到的信息显示到通信编辑栏中
? ? ? ? ui->textEdit_Record->append("服务端say:" + receiveAll);
? ? });
?
? ? // 开始的时候断开连接按钮置成不可用状态
? ? ui->disConBtn->setEnabled(false);
?
? ? // 判断是否连接成功
? ? connect(clientSocket, &QTcpSocket::connected, this, [=]()
? ? {
? ? ? ? // 将成功连接显示到通信记录编辑栏中
? ? ? ? ui->textEdit_Record->append("成功与服务端取得连接!!!");
? ? ? ? // 将断开连接置成可用状态
? ? ? ? ui->disConBtn->setEnabled(true);
? ? });
?
? ? // 判断是否断开连接
? ? connect(clientSocket, &QTcpSocket::disconnected, this, [=]()
? ? {
? ? ? ? // 将服务端断开连接显示到通信编辑框中
? ? ? ? ui->textEdit_Record->append("注意服务端已断开连接!!!");
? ? ? ? // 将连接服务端按钮置成不可用状态
? ? ? ? ui->conBtn->setEnabled(false);
? ? });
?
}
?
Client::~Client()
{
? ? delete ui;
}
?
// 点击按钮连接服务器,绑定地址与端口
void Client::on_conBtn_clicked()
{
? ? // 获取编辑框中的ip和端口
? ? unsigned short port = ui->lineEdit_port->text().toUShort();
? ? QString addr = ui->lineEdit_add->text();
? ? clientSocket->connectToHost(addr, port);
? ? // 需要将按钮置成不可用状态
? ? ui->conBtn->setEnabled(false);
}
?
// 断开连接
void Client::on_disConBtn_clicked()
{
? ? //clientSocket->disconnected();
? ? // 关闭套接字
? ? clientSocket->close();
? ? // 将客户端断开连接提示显示到通信编辑框中
? ? ui->textEdit_Record->append("注意客户端已断开连接!!!");
? ? // 将连接服务端按钮置成可用状态
? ? ui->conBtn->setEnabled(true);
}
?
// 点击按钮发送数据
void Client::on_sendBtn_clicked()
{
? ? // 获取发送信息编辑框的文本
? ? //ui->textEdit_Send->toPlainText().toUtf8();
?
? ? // 将获取到的信息发送给服务端
? ? clientSocket->write(ui->textEdit_Send->toPlainText().toUtf8());
? ? // 将发送的信息显示到通信记录编辑框中
? ? ui->textEdit_Record->append(ui->textEdit_Send->toPlainText().toUtf8());
? ? // 需要将发送编辑框清空缓存
? ? ui->textEdit_Send->clear();
}

client.h

#ifndef CLIENT_H
#define CLIENT_H
?
#include <QMainWindow>
#include <QTcpSocket>
?
namespace Ui {
class Client;
}
?
class Client : public QMainWindow
{
? ? Q_OBJECT
?
public:
? ? explicit Client(QWidget *parent = nullptr);
? ? ~Client();
?
private slots:
? ? void on_conBtn_clicked();
?
? ? void on_disConBtn_clicked();
?
? ? void on_sendBtn_clicked();
?
private:
? ? Ui::Client *ui;
?
? ? // 创建套接字
? ? QTcpSocket * clientSocket;
};
?
#endif // CLIENT_H

程序UI

Qt TCP实现简单通信功能

来源:https://blog.csdn.net/m0_60178310/article/details/124989566

标签:Qt,TCP,通信
0
投稿

猜你喜欢

  • 关于Spring Boot获取bean的3种方式

    2023-07-08 11:52:15
  • Java 中很好用的数据结构EnumSet

    2023-12-06 09:37:23
  • C#实现自动生成电子印章

    2022-12-08 10:47:58
  • springboot如何使用AOP做访问请求日志

    2023-11-11 10:12:19
  • springboot使用自定义注解实现aop切面日志

    2023-11-11 09:14:48
  • 深入理解Java 类加载全过程

    2023-10-20 12:34:23
  • java实现动态代理示例分享

    2023-04-28 15:54:49
  • C#预处理器指令的用法实例分析

    2023-03-09 16:21:07
  • Spring内存缓存Caffeine的基本使用教程分享

    2023-05-26 00:30:33
  • Springboot打成war包并在tomcat中运行的部署方法

    2022-06-29 07:53:32
  • c#队列Queue学习示例分享

    2022-06-30 13:39:45
  • mybatis中使用oracle关键字出错的解决方法

    2022-05-14 10:19:23
  • 在Android中如何使用DataBinding详解(Kotlin)

    2022-12-17 15:09:51
  • Mybatis参数传递示例代码

    2023-05-20 09:43:08
  • Android开发之文件操作模式深入理解

    2023-10-14 02:48:12
  • java1.8安装及环境变量配置教程

    2023-04-29 10:36:49
  • Spring Bean初始化及销毁多种实现方式

    2023-06-10 13:14:01
  • 用Flutter开发自定义Plugin的方法示例

    2023-07-05 00:19:40
  • Java语言实现Blowfish加密算法完整代码分享

    2023-11-02 21:30:07
  • Java 静态代理与动态 代理解析

    2023-08-22 17:18:19
  • asp之家 软件编程 m.aspxhome.com