C++ 创建 TcpClient 客户端,使用QAbstractSocket 、 QtNetwork

初学 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 测试可以看到收发的数据:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用 Visual Studio 2019 创建一个简单的 C++ TCP 客户端的代码示例: ```cpp #include <iostream> #include <winsock2.h> #pragma comment(lib, "ws2_32.lib") int main() { WSADATA wsaData; if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { std::cerr << "Failed to initialize winsock" << std::endl; return 1; } // 创建套接字 SOCKET clientSocket = socket(AF_INET, SOCK_STREAM, 0); if (clientSocket == INVALID_SOCKET) { std::cerr << "Failed to create socket" << std::endl; return 1; } // 设置服务器地址和端口 sockaddr_in serverAddress{}; serverAddress.sin_family = AF_INET; serverAddress.sin_port = htons(12345); // 将端口号转换为网络字节顺序 serverAddress.sin_addr.s_addr = inet_addr("127.0.0.1"); // 设置服务器 IP 地址 // 连接到服务器 if (connect(clientSocket, (struct sockaddr*)&serverAddress, sizeof(serverAddress)) == SOCKET_ERROR) { std::cerr << "Failed to connect to server" << std::endl; closesocket(clientSocket); WSACleanup(); return 1; } // 发送数据到服务器 const char* message = "Hello, server!"; if (send(clientSocket, message, strlen(message), 0) == SOCKET_ERROR) { std::cerr << "Failed to send data to server" << std::endl; closesocket(clientSocket); WSACleanup(); return 1; } // 接收服务器的响应 char buffer[1024]; memset(buffer, 0, sizeof(buffer)); if (recv(clientSocket, buffer, sizeof(buffer) - 1, 0) == SOCKET_ERROR) { std::cerr << "Failed to receive data from server" << std::endl; closesocket(clientSocket); WSACleanup(); return 1; } std::cout << "Response from server: " << buffer << std::endl; // 关闭套接字和清理 winsock closesocket(clientSocket); WSACleanup(); return 0; } ``` 这段代码使用 Winsock 库实现了一个简单的 TCP 客户端。它首先初始化 Winsock,然后创建一个套接字,设置服务器地址和端口,连接到服务器,发送数据,接收服务器的响应,最后关闭套接字和清理 Winsock。 请注意,这段代码假设服务器 IP 地址为 "127.0.0.1",端口号为 12345。你需要根据你实际的服务器地址和端口号进行修改。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值