QT-使用QTcpSocket建立TCP客户端连接


前言

使用QT的QTcpSocket建立TCP客户端方式,十分的简单,上手也快,代码量不多,并且还自动支持重连接机制,也就是说如果你的服务端突然死机了,然后服务端又重启,那么我们的客户端这个时候是会自动去再连接的,不需要你的程序再做重连接的机制,所以我们应用起来是十分方便的。


一、QT配合环境

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

二、程序内容

1.实例头文件

代码如下:

#pragma once
#include <QThread>
#include <QObject>
#include <QTcpSocket>
#include <QThread>
#include <QTimer>
#include <QMutex>
#include <QAbstractSocket>

// 链表操作类型
enum eType
{
	APPEND = 0,          
	TAKE_FIST = 1,       
};

class CSocket: public QObject
{
	Q_OBJECT

public:
	cSocketClient(QObject *parent = 0);
	~cSocketClient();

public:
	// 连接
	bool connect(QString strIp, int nPort);
	// 发送数据
	bool sendData(QString strData);
	// 是否连接
	bool isConnected();
	// 获取数据
	QString getRecieveData();

private slots:
   // 接受服务器的数据槽函数
	void slotRecieve();
   // 连接状态变化的时候触发
	void slotStateChanged(QAbstractSocket::SocketState state);

private:
	void operatorRevieveData(eType type, QString& strItem);

private:
	QTcpSocket *m_pSocket;             // 客户端Socket对象
	QString m_strServerIp;             // 服务端IP
	QList<QString> m_strReciveList;    // 接受回来的数据放到链表里面
	bool m_bConnected;                 // 连接的标志
	int m_nConnectWaitTimes;           // 连接的等待时间
	int m_nServerPort;                 // 服务端端口号
};

2.源文件

代码如下:

#include "CSocket.h"

CSocket::cSocketClient(QObject *parent)
	: QObject(parent)
	,m_bConnected(false)
	,m_nConnectWaitTimes(1*1000)
	,m_strServerIp("")
	,m_nServerPort(0)
{
	m_strReciveList.clear();

	m_pSocket = new QTcpSocket(this);

	QObject::connect(m_pSocket, SIGNAL(readyRead()), this, SLOT(slotRecieve()));
	QObject::connect(m_pSocket, SIGNAL(stateChanged(QAbstractSocket::SocketState)), this, SLOT(slotStateChanged(QAbstractSocket::SocketState)));

}

CSocket::~cSocketClient()
{
	if (m_pSocket != nullptr)
		m_pSocket->close();
}

// 连接服务端
bool CSocket::connect(QString strIp, int nPort)
{
	if (m_bConnected)
		return true;

	m_strServerIp = strIp;
	m_nServerPort = nPort;

	// 设置IP和端口号连接
	m_pSocket->connectToHost(m_strServerIp, m_nServerPort);

	// 设置超时连接时间
	m_bConnected = m_pSocket->waitForConnected(1 * 1000);


	return m_bConnected;
}

// 给服务端发送数据
bool CSocket::sendData(QString strData)
{
	if (!m_bConnected)
		return false;

	int nRet = m_pSocket->write(strData.toStdString().c_str(), strlen(strData.toStdString().c_str()));

	return true;
}

// 是否连接
bool CSocket::isConnected()
{
	return m_bConnected;
}

// 接受服务返回的数据
void CSocket::slotRecieve()
{
	QByteArray arrayReady = m_pSocket->readAll();
	QString strRecive = QString::fromStdString(arrayReady.toStdString());

	if (!strRecive.isEmpty())
		operatorRevieveData(OT_APPEND, strRecive);
}

// 接受数据
QString CSocket::getRecieveData()
{
	QString strItem;
	operatorRevieveData(OT_TAKE_FIST, strItem);
	return strItem;
}

// 接受数据操作链表
void CSocket::operatorRevieveData(eType type, QString& strItem)
{
	static QMutex mutex;

	mutex.lock();
	switch (type)
	{
	
	// 追加
	case APPEND:
	{
		m_strReciveList << strItem;
	}break;

	// 获取首元素,并删除首元素
	case TAKE_FIST:
	{
		if (m_strReciveList.size() > 0)
			strItem = m_strReciveList.takeFirst();
	}break;

	default:
		break;
	}

	mutex.unlock();
}

// 连接状态切换
void CSocket::slotStateChanged(QAbstractSocket::SocketState state)
{
	switch (state)
	{
		case QAbstractSocket::SocketState::UnconnectedState:
		{
			m_bConnected = false;
		}break;

		case QAbstractSocket::SocketState::ConnectedState:
		{
			m_bConnected = true;
		}break;

		default:
			break;
	}
}
  • 6
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

进击的大海贼

联系博主,为您提供有价值的资源

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值