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

embedded/2024/10/19 9:35:18/

学习自《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/embedded/19013.html

相关文章

Day41 HTTP编程

Day41 HTTP编程 文章目录 Day41 HTTP编程HTTP概念应用场景主要方面 HTTP案例案例一:获取淘宝商品周边类别案例二:下载图片 HTTP 概念 HTTP编程指的是使用HTTP协议进行网络编程的过程。HTTP是一种用于传输超文本的应用层协议,通常用于在客户…

QML与C++交互

Qt 你好 | 专注于Qt的技术分享平台 QML写界面,业务逻辑使用C,既能快速的开发界面也能利用C的强大生态,这是目前比较被认可的方式,那就涉及到QML与C对象的交互。 我们以登录例子来说明,页面点击登录,将信息…

区块链技术:NFG元宇宙电商模式

大家好,我是微三云周丽 随着互联网技术的迅猛发展,电子商务行业逐渐崛起为现代经济的重要支柱。而在这一浪潮中,元宇宙电商以其独特的商业模式和巨大的发展潜力,成为行业的新宠。其中,NFG作为元宇宙电商模式的代表&am…

鸿蒙(HarmonyOS)性能优化实战-多线程共享内存

概述 在应用开发中,为了避免主线程阻塞,提高应用性能,需要将一些耗时操作放在子线程中执行。此时,子线程就需要访问主线程中的数据。ArkTS采用了基于消息通信的Actor并发模型,具有内存隔离的特性,所以跨线…

FSMC读取FPGA的FIFO

一、硬件说明 FSMC配置 单片机的代码如下: #define VALUE_ADDRESS_AD1 (__IO uint16_t *)0x60400000while (1){if(!HAL_GPIO_ReadPin(GPIOF, GPIO_PIN_8)) //数据非空{data *(__IO uint16_t *)VALUE_ADDRESS_AD1;data2 *(__IO uint16_t *)VALUE_ADDRESS_AD1…

RabbitMQ(高级)笔记

一、生产者可靠性 (1)生产者重连(不建议使用) logging:pattern:dateformat: MM-dd HH:mm:ss:SSSspring:rabbitmq:virtual-host: /hamllport: 5672host: 192.168.92.136username: hmallpassword: 123listener:simple:prefetch: 1c…

TCP关闭连接时的一些思考

TCP协议是TCP/IP栈中最复杂的协议,它最大的优点是传输的可靠性,这通过面向连接、按序传输、超时重传、流量控制等机制保证其传输的可靠性。但这并不是我们今天要讨论的重点! TCP通信的过程分别是三个阶段:建立连接、传输数据、关…

【网络安全】HTTP协议 — 基础

专栏文章索引:网络安全 有问题可私聊:QQ:3375119339 目录 学习目标​ 一、万维网的诞生与发展​编辑 1.万维网的诞生与发展 2.HTTP协议诞生与发展 二、网络基础 1.TCP/IP分层传输 1)TCP/IP协议 2)封装与拆封 …