Qt tcp通信(客户端+服务器一对一)

news/2024/9/23 11:16:00/

学习自《Qt5.9 C++开发指南》

服务器端: 

QTcpServer *tcpServer; //TCP服务器
tcpServer=new QTcpServer(this);
connect(tcpServer,SIGNAL(newConnection()),this,SLOT(onNewConnection()));

当有新的客户端接入时,QTcpServer内部的incomingConnection()函数会创建一个与客户端相连的QTcpSocket对象,然后发射信号newConnection()。

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

使用nextPendingConnection()接受客户端的连接,然后使用QTcpSocket与客户端通信。 

    connect(tcpSocket, SIGNAL(connected()),this, SLOT(onClientConnected()));

客户端socket连接建立时发射此信号 

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()));
}
tcpSocket->peerAddress():对方socket的地址
tcpSocket->peerPort():对方socket的端口
    connect(tcpSocket, SIGNAL(disconnected()),this, SLOT(onClientDisconnected()));

 客户端socket连接断开时发射此信号

void MainWindow::onClientDisconnected()
{//客户端断开连接时ui->plainTextEdit->appendPlainText("**client socket disconnected");tcpSocket->deleteLater();//    deleteLater();//QObject::deleteLater();
}
    connect(tcpSocket,SIGNAL(stateChanged(QAbstractSocket::SocketState)),this,SLOT(onSocketStateChange(QAbstractSocket::SocketState)));

本程序的socket状态变化时发射此信号

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");}
}

 

tcpSocket->state();

返回socket当前的状态

    connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(onSocketReadyRead()));

本程序的socket的读取缓冲区有新数据时发射此信号

void MainWindow::onSocketReadyRead()
{//读取缓冲区行文本
//    QStringList   lines;while(tcpSocket->canReadLine())ui->plainTextEdit->appendPlainText("[in] "+tcpSocket->readLine());
//        lines.append(clientConnection->readLine());
}

 

canReadLine():如果有行数据要从socket缓冲区读取,返回true
    QString     IP=ui->comboIP->currentText();//IP地址quint16     port=ui->spinPort->value();//端口QHostAddress    addr(IP);tcpServer->listen(addr,port);//
//    tcpServer->listen(QHostAddress::LocalHost,port);// Equivalent to QHostAddress("127.0.0.1").

 监听

    if (tcpServer->isListening()) //tcpServer正在监听{tcpServer->close();//停止监听}

停止监听

void MainWindow::on_btnSend_clicked()
{//发送一行字符串,以换行符结束QString  msg=ui->editMsg->text();ui->plainTextEdit->appendPlainText("[out] "+msg);QByteArray  str=msg.toUtf8();str.append('\n');//添加一个换行符tcpSocket->write(str);
}

tcpSocket向客户端发送信息

客户端:

QTcpSocket  *tcpClient;  //socket
tcpClient=new QTcpSocket(this); //创建socket变量
    QString     addr=ui->comboServer->currentText();quint16     port=ui->spinPort->value();tcpClient->connectToHost(addr,port);

以异步方式连接到指定IP地址和端口的TCP服务器,连接成功后会发射connected()信号 

    if (tcpClient->state()==QAbstractSocket::ConnectedState)tcpClient->disconnectFromHost();

断开socket,关闭成功后发射disconnected()信号 


http://www.ppmy.cn/news/1445667.html

相关文章

Linux 根据提交记录生成补丁及新旧文件对比

#!/bin/bash#解决/bin/bash^M: bad interpreter: Text file busy #sed -i s/\r$// test1.shCMD1$1 CMD2$2 CMD3$3 echo "CMD1 > $CMD1" echo "CMD2 > $CMD2" echo "CMD3 > $CMD3" # 运行时的入参 CMD1提交记录1 CMD2提交记录2 CMD3输出…

代码随想录算法训练营第五十六天|583.两个字符串的删除操作、72.编辑距离

文档链接:https://programmercarl.com/ LeetCode583.两个字符串的删除操作 题目链接:https://leetcode.cn/problems/delete-operation-for-two-strings/ 思路:dp[i][j]:使以i-1为尾的word1和以j-1为尾的word2相同的最小步数 当…

StarRocks x Paimon 构建极速实时湖仓分析架构实践

Paimon 介绍 Apache Paimon 是新一代的湖格式,可以使用 Flink 和 Spark 构建实时 Lakehouse 架构,以进行流式处理和批处理操作。Paimon 创新性地使用 LSM(日志结构合并树)结构,将实时流式更新引入 Lakehouse 架构中。 …

Django-admin组件

Django-admin组件 admin是django中提供的一套可视化工具:用于对ORM中定义的表进行增删改查。 1 概览 在django项目启动时,自动找到注册到admin中的所有model中定义的类,然后为这些类生成一系列的URL和视图函数,实现基本增删改查…

FR-TSN4206获得“时间敏感网络产业链名录计划”测试认证证书,TSN交换机助力智能工业发展

TSN技术,即时间敏感网络技术,已成为智能工业、自动驾驶等领域的核心。它通过时钟同步、数据调度等功能,确保低延迟、高可靠性的数据传输。 为推动TSN技术在我国的发展,工业互联网产业联盟联合多家单位启动了“时间敏感网络产业链名…

第三十章:docker如何部署openresty

docker如何部署openresty 目标 了解docker 中volumes数据卷的读写控制通过 openresty 配置掌握挂载nginx.confOpenResty OpenResty(又称ngx_openresty)是一个基于Nginx的可伸缩的Web平台,由中国人章亦春发起。它利用了Nginx模块化、可扩展的特性,开发了一系列的增强模块,…

24考研双非上岸武汉理工大学电子信息专硕,855考研经验

目录 一、考研择校经验 二、武理考研初试经验 三、武理考研复试经验 一、考研择校经验 我建议学弟学妹们确定院校时没必要一上来就说我一定要考某个院校。其实考哪个学校是要在考研备考的过程中慢慢探索,慢慢研究的,不过最晚9月初一定要确定院校了&a…

[C++][算法基础]整数划分(统计动态规划)

一个正整数 𝑛 可以表示成若干个正整数之和,形如:𝑛𝑛1𝑛2…𝑛𝑘,其中 𝑛1≥𝑛2≥…≥𝑛𝑘,𝑘≥1。 我们将这…