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
客户端:
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文章来源:https://www.toymoban.com/news/detail-508002.html
#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
文章来源地址https://www.toymoban.com/news/detail-508002.html
到了这里,关于Qt TCP简单通信的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!