ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Qt进阶-TCP网口通信

2021-07-02 12:59:18  阅读:353  来源: 互联网

标签:tcpSocket Qt TCP 网口 ui QString 接收数据 服务端 客户端


Qt进阶-网口通信

获取当前IP

QList<QHostAddress> addressList = QNetworkInterface::allAddresses();	//获取所有的网络列表

QString IP = "";

for each(QHostAddress address in addressList)
{
	//获取Ipv4网络,并且非空且不等于127.0.0.1
	if (address.protocol() == QAbstractSocket::IPv4Protocol &&address != QHostAddress::Null &&	address != QHostAddress::LocalHost)
	{
		IP = address.toString();
		ui->lineEdit_socketIP->setText(IP);
		break;
	}
}


服务端

服务端开启监听

QTcpServer *m_tcpServer = new QTcpServer;			//tcp服务端对象

QString serverIP = ui->lineEdit_socketIP->text();
int serverPort = ui->lineEdit_portId->text().toInt();

bool flg = m_tcpServer->listen(QHostAddress(serverIP), serverPort);

新的客户端连接到达

connect(m_tcpServer, SIGNAL(newConnection()), this, SLOT(sls_tcpServerNewConnection()));	//tcp服务端有新连接到达

void ComNetTool::sls_tcpServerNewConnection()
{
	QTcpSocket *newSocket = m_tcpServer->nextPendingConnection();

	connect(newSocket, SIGNAL(readyRead()), this, SLOT(sls_tcpServerRecvMsg()));			//tcp客户端接收数据

	ui->cbBox_socketInfo->addItem(newSocket->peerAddress().toString() + ":" + QString::number(newSocket->peerPort()));

	m_clientList.append(newSocket);
}

服务端接收数据

void ComNetTool::sls_tcpServerRecvMsg()
{
	QTcpSocket *s = (QTcpSocket *)sender();

	QByteArray recvBuffer = s->readAll();		//获取网口数据

	if (!recvBuffer.isEmpty())
	{
		ui->textEdit_recText->append(QString("[网口:从%1:%2接收]\r\n").arg(s->peerAddress().toString()).arg(s->peerPort()) + QString::fromLocal8Bit(recvBuffer));		//显示数据,fromLocal8Bit防止中文乱码
	}
}

服务端发送数据

int socketIndex = ui->cbBox_socketInfo->currentIndex();

if (0 == socketIndex)		//给所有客户端对象发送
{
	for each (QTcpSocket *s in m_clientList)
	{
		s->write(data);
	}
}
else						//给单一客户端对象发送
{
	m_clientList.at(socketIndex - 1)->write(data);
}

客户端

连接到服务端

QTcpSocket *m_tcpSocket = new QTcpSocket;			//tcp客户端对象

QString serverIP = ui->lineEdit_socketIP->text();
int serverPort = ui->lineEdit_portId->text().toInt();

//连接到服务端
m_tcpSocket->abort();								//断开连接
m_tcpSocket->connectToHost(serverIP, serverPort);	//连接服务端
bool bRet = m_tcpSocket->waitForConnected(1000);

if (!bRet)
{
	//...
}
else
{
	ui->cbBox_socketInfo->addItem(m_tcpSocket->localAddress().toString() + ":" + QString::number(m_tcpSocket->localPort()));	//当前客户端信息
}

客户端接收数据

connect(m_tcpSocket, SIGNAL(readyRead()), this, SLOT(sls_tcpSocketRecvMsg()));				//tcp客户端接收数据

void ComNetTool::sls_tcpSocketRecvMsg()
{
	QByteArray recvBuffer = m_tcpSocket->readAll();		//获取网口数据

	if (!recvBuffer.isEmpty())
	{
		ui->textEdit_recText->append(QString::fromLocal8Bit(recvBuffer));		//显示数据,fromLocal8Bit防止中文乱码
	}
}

客户端发送数据

QByteArray sendData = ui->textEdit_send->toPlainText().toLocal8Bit();		//防止中文乱码

m_tcpSocket->write(sendData);			//写入网口数据

标签:tcpSocket,Qt,TCP,网口,ui,QString,接收数据,服务端,客户端
来源: https://blog.csdn.net/qq_36170958/article/details/118385545

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有