初学 C++ 创建 TcpClient 客户端,代码如下:
qtcpclients.cpp
#include "qtcpclients.h"
#include <QtNetwork>
#include "QDebug"
// 代码一运行就初始化创建实例 ,本身就线程安全
QTcpClient* QTcpClient::m_instance = new (std::nothrow) QTcpClient;
QTcpClient* QTcpClient::getInstance()
{
return m_instance;
}
void QTcpClient::deleteInstance()
{
if (m_instance)
{
delete m_instance;
m_instance = NULL;
}
}
QTcpClient::QTcpClient()
{
tcpSocket=new QTcpSocket();
tcpSocket->abort(); //取消原有连接
connect(tcpSocket, &QTcpSocket::readyRead,this, &QTcpClient::ReadData); //获取数据
void (QAbstractSocket::*p)(QAbstractSocket::SocketError) =&QAbstractSocket::error; //函数指针
connect(tcpSocket, p, this, &QTcpClient::ReadError); //检测异常
}
void QTcpClient::connectServer()
{
tcpSocket->connectToHost("192.168.1.34", 8888);
if(tcpSocket->waitForConnected(1000))
{
qDebug()<<"connect success";
isConnect = true;
}
else
{
qDebug()<<"connect fail";
isConnect = false;
}
}
void QTcpClient::disconnect()
{
tcpSocket->disconnectFromHost();
qDebug()<<"disconnect";
}
void QTcpClient::sendData(QString data)
{
// QString data="Hello World\n";
qDebug()<<"sendData发送=== " << data.toLatin1();
tcpSocket->write(data.toLatin1());
}
void QTcpClient::ReadData()
{
QByteArray buffer=tcpSocket->readAll();
if(!buffer.isEmpty())
{
qDebug()<< "收到的数据=== " <<buffer;
}
}
void QTcpClient::ReadError(QAbstractSocket::SocketError e)
{
tcpSocket->disconnectFromHost();
qDebug()<<"socket error: "<<e;
qDebug()<<tcpSocket->errorString();
}
bool QTcpClient::isLinked() {
return isConnect;
}
qtcpclients.h
#ifndef QTCPCLIENTS_H
#define QTCPCLIENTS_H
#include <QWidget>
#include <QDialog>
#include <QAbstractSocket>
class QTcpSocket;
class QTcpClient:public QObject
{
Q_OBJECT
public:
static QTcpClient* getInstance();
// 释放单实例,进程退出时调用
static void deleteInstance();
private:
//饿汉式单例 (本身就线程安全) 直接构建实例
// 唯一单实例对象指针
static QTcpClient* m_instance;
// 将其构造和析构成为私有的, 禁止外部构造和析构
QTcpClient();
private:
// QTcpSocket *tcpSocket;
QString currentForture;
quint16 blockSize;
public:
QTcpSocket* tcpSocket;
void connectServer();
void disconnect();
void sendData(QString data);
void ReadData();
void ReadError(QAbstractSocket::SocketError e);
bool isLinked();
bool isConnect = false;
private slots:
};
#endif // TCPCLIENT_H
要在.pro 里加上下面这句代码,要不然 QAbstractSocket 和 QtNetwork 找不到
QT += core gui network
局部调用的地方:
QTcpClient *tcp= QTcpClient::getInstance();
if(!tcp->isLinked()){
tcp->connectServer();
}
tcp->sendData("0");
也可以把tcpcomm 提出来,全局使用:
QTcpClient* MediaServer::tcpcomm = QTcpClient::getInstance();
if(!tcpcomm->isLinked()){
tcpcomm->connectServer();
}
tcpcomm->sendData("0");
public:
static QTcpClient *tcpcomm; //静态局部变量 不会消失
使用网络调试助手打开 tcp server 测试可以看到收发的数据: