QT TCP网络编程——服务端的实现

QT TCP网络编程——服务端的实现


温馨提示:初来乍到,请多关照,文章如有不足,还请不吝赐教。本程序是仿照通讯助手(NetAssist.exe)进行界面设计以及基本功能实现的,主要实现的功能有监听服务器端口、发送、接收数据。使用到的工具及编程语言为:visual studio 2015、QT、C++,其中代码仅供参考

前言


提示:以下是本篇文章正文内容,下面案例可供参考
视频演示:

一、QT TCP服务器

在开始编写代码之前,首先要知道QT网络编程需要用到两个类:
1、QTcpServer:主要是实现服务器的端口监听。
2、QTcpSocket:套接字,消息的接收和发送。
以上两个类是实现QT TCP服务器必不可少的,这与QT TCP客户端用的只有QTcpSocket类,后面的文章会讲到,此处不做过多赘述。

二、编程步骤

1.引入主要的库

#include “qtcpserver.h”
#include “qtcpsocket.h”
#include “qnetworkinterface.h”


2.界面的设计

主要使用的是QT,拉取控件实现的:
在这里插入图片描述


3.具体实现步骤

3.1自动获取本机地址

如果是简单的使用QNetworkInterface::allAddresses(),获取到的IP集合中包含fff之类的数据,所以就需要进行筛选。筛选本地地址的主要思路如下:
1.IP地址的组成主要是数字;
2.IP地址的范围主要是0.0.0.0~255.255.255.255之间(不细分);
3.IP字段都包含“.”;
4.IP字段以“.”划分,有四段;
根据上面的思路,就可以在程序加载后,将本地合法的IP地址渲染到QComboBox中。

代码如下(示例):

QStringList strList;
	//得到本地IP的一个集合
	QList<QHostAddress> ipList = QNetworkInterface::allAddresses();
	//循环取出
	for (int i = 0; i < ipList.size(); i++) {
		QString ipStr = ipList[i].toString();
		//ip地址在7~15之间
		if (ipStr.size() < 7 || ipStr.size() > 15) {
			continue;
		}

		QStringList ipStrList = ipStr.split(".");
		//ip以.隔开 分为4组
		if (ipStrList.size() != 4) {
			continue;
		}

		for (int j = 0; j < ipStrList.size(); j++) {
			int ipData = ipStrList[j].toInt();
			try
			{
				//必须是数字 并且在0~255
				if (ipData < 0 || ipData > 255) {
					break;
				}
			}
			catch (const std::exception&)
			{
				break;
			}
		}
		strList.append(ipStr);
	}
	impl->ui.ipAddressBox->addItems(strList);

3.1 监听端口

开启服务器端口服务,建立QTcpServer对象,使用listen()方法就可以开启指定的端口。

impl->tcpServer->listen(ipAddress, port)//监听指定IP 端口

服务器监听成功后,客户即可通过指定的IP和端口连接到该服务器。服务器通过接收到newConnction()信号来判断是否有客户连接。

connect(impl->tcpServer, SIGNAL(newConnection()), this,SLOT(dealNewClientConnect()));

3.2 客户连接

由于连接到服务器的客户不止一个,且服务器在发送数据时,可以进行群发,也可以进行单发,所以在客户连接到服务器时,一定要先存储好每个可户端。这里使用的是构造一个结构体数据来存储。

typedef struct {
QString clientIpAddress;
quint16 clientPort;
QTcpServer* sockServers;
QTcpSocket* tcpClients;
}ClientInfos;

有了结构体后,当有新的客户连接到服务器时,将该客户端的IP即端口存储下来,代码如下:

ClientInfos info;
//有新的连接
impl->tcpSocket = impl->tcpServer->nextPendingConnection();
info.tcpClients = impl->tcpSocket;
//获取连接到服务器的客户IP及地址
quint16 port = impl->tcpSocket->peerPort();
info.clientPort = port;
//IP
QHostAddress address =  impl->tcpSocket->peerAddress();
QString ip = address.toString();
info.clientIpAddress = ip;
//添加到结构体
impl->tcpSocketLists.append(info);

//更新combox
updateConnectBox();

impl->ui.receiveEdit->append(QString("[%1]# IP:%2,PORT:%3已连接").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss")).arg(ip).arg(port)+"<br/>");
//当客户有数据过来时,会产生readyRead信号
connect(impl->tcpSocket, SIGNAL(readyRead()), this, SLOT(receiveData()));
//当客户自动断开连接时,会产生disconnected信号
connect(impl->tcpSocket, SIGNAL(disconnected()), this, SLOT(dealDisconnected()));

3.3 读写数据

服务器的接收和发送数据,主要是QTcpSocket提供的。
1.读:

QByteArray arrs = impl->tcpSocketLists.at(i).tcpClients->readAll();

2.写:

impl->tcpSocketLists.at(i).tcpClients->write(sendData.toLatin1());

3.4 客户断开连接

客户端自动断开连接时,会产生disconnected信号。这里主要是为了重新渲染连接到服务器的客户端数量。

4 程序代码链接

百度网盘链接分享

提取码:6565


总结

提示:这里主要是自己写这个程序过程的感悟,读者可看可不看:

其实QT为TCP网络编程提供了现成的类,只需要调用即可。主要还是界面功能的一些实现,需要好好去琢磨。好了,QT服务器的实现就介绍在这了,有什么问题或想法,请私信我哦,下期再见!拜谢!

  • 16
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
QT5串口编程可以用于编写简单的上位机,通过串口与下位机进行通信。下面是一个简单的上位机编写示例: 首先,要在QT项目中加入串口模块,可以通过在.pro文件中加入以下代码实现: ``` QT += serialport ``` 接下来,创建一个新的类,命名为SerialPort,继承自QObject,并添加以下代码: ```cpp #include "serialport.h" SerialPort::SerialPort(QObject *parent) : QObject(parent) { serial = new QSerialPort(this); connect(serial, &QSerialPort::readyRead, this, &SerialPort::readData); } void SerialPort::openPort(QString portName, qint32 baudRate) { serial->setPortName(portName); serial->setBaudRate(baudRate); if(serial->open(QIODevice::ReadWrite)) { qDebug() << "Serial port is open"; } else { qDebug() << "Serial port failed to open"; } } void SerialPort::closePort() { if(serial->isOpen()) { serial->close(); qDebug() << "Serial port is closed"; } } void SerialPort::readData() { QByteArray data = serial->readAll(); qDebug() << "Received data: " << data; // 在这里可以对接收到的数据进行处理 } void SerialPort::writeData(QByteArray data) { if(serial->isOpen()) { serial->write(data); qDebug() << "Sent data: " << data; } else { qDebug() << "Serial port is not open"; } } ``` 在主窗口中,可以使用SerialPort类的实例来控制串口的打开、关闭和数据的读写,可以通过按钮来触发相应的操作。下面是一个简单的主窗口实现: ```cpp #include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); serialPort = new SerialPort(this); connect(ui->openButton, &QPushButton::clicked, this, &MainWindow::openPort); connect(ui->closeButton, &QPushButton::clicked, this, &MainWindow::closePort); connect(ui->sendButton, &QPushButton::clicked, this, &MainWindow::sendData); } MainWindow::~MainWindow() { delete ui; } void MainWindow::openPort() { QString portName = ui->portComboBox->currentText(); qint32 baudRate = ui->baudRateComboBox->currentText().toInt(); serialPort->openPort(portName, baudRate); } void MainWindow::closePort() { serialPort->closePort(); } void MainWindow::sendData() { QString data = ui->sendLineEdit->text(); serialPort->writeData(data.toUtf8()); ui->sendLineEdit->clear(); } ``` 在QT设计器中,可以创建一个MainWindow窗口,包含一个QComboBox用于选择串口号,一个QComboBox用于选择波特率,一个QLineEdit用于输入发送的数据,以及几个QPushButton用于触发相应的操作。 以上就是一个简单的QT5串口编程的上位机实现,你可以根据具体的需求进行进一步的修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值