前言
使用QT的QTcpSocket建立TCP客户端方式,十分的简单,上手也快,代码量不多,并且还自动支持重连接机制,也就是说如果你的服务端突然死机了,然后服务端又重启,那么我们的客户端这个时候是会自动去再连接的,不需要你的程序再做重连接的机制,所以我们应用起来是十分方便的。
一、QT配合环境
二、程序内容
1.实例头文件
代码如下:文章来源:https://www.toymoban.com/news/detail-625426.html
#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.源文件
代码如下:文章来源地址https://www.toymoban.com/news/detail-625426.html
#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;
}
}
到了这里,关于QT-使用QTcpSocket建立TCP客户端连接的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!