天天看点

Qt【TCPSocket】一个简单的TCPSocket的demo

哈哈哈,在小女子的一番折腾下,终于把TCPSocket客户端与服务端的小demo整出来了!!

表示很鸡冻!!如下是总结,走过路过不要错过~~

(注:鄙人用的是Qt Quick,不是Qt GUI,Qt版本为Qt5.7)

First,来看看客户端的实现。

1.客户端创建TCP连接的步骤

  • new一个QTcpSocket对象出来
  • 准备好端口号及IP地址之后,调用connectToHost创建连接
  • 启用waitForConnected判断是否连接成功
  • 写一个槽函数与信号readyRead连起来,异步读取数据
  • 调用write(data)发送数据;

2.以下是客户端的demo

我建了一个客户端的类,类名为TCPClient,在main.cpp中注册了一下这个类,方便跟界面qml交互。

.h文件

#include <QObject>
#include <QTcpSocket>
class TCPClient : public QObject
{
    Q_OBJECT
public:
    TCPClient();
    ~TCPClient();
    Q_INVOKABLE void setIP(const QString ip);
    QString getIP(){return m_ip;}
    Q_INVOKABLE void setPort(const int port);
    int getPort(){return m_port;}

    void onConnected();
    void getMsg();

public slots:
    void createTcpConnect();
    void sendMsg2Sev(const QString msg);

signals:
    void showMsg(const QString &msg);

private:
    QTcpSocket *m_tcpsocket;
    QString m_ip;
    int m_port;
};
           

.cpp文件

#include "tcpclient.h"
#include <QDebug>

TCPClient::TCPClient(){
    m_ip = "127.0.0.1";
    m_port = 60000;
    m_tcpsocket = new QTcpSocket();
    /*-<连接信号槽 */
    qDebug()<<"create a default TCP client!";
    connect(m_tcpsocket,&QTcpSocket::connected,this,&TCPClient::onConnected,Qt::AutoConnection);
    connect(m_tcpsocket,&QTcpSocket::readyRead,this,&TCPClient::getMsg,Qt::AutoConnection);
}

TCPClient::~TCPClient(){
    m_tcpsocket->deleteLater();
}

void TCPClient::setIP(const QString ip){
    m_ip = ip;
    qDebug()<<"set IP: "<<ip;
}

void TCPClient::setPort(const int port){
    m_port = port;
    qDebug()<<"set port: "<<port;
}

void TCPClient::onConnected(){
    qDebug()<<"already connect the host : "<<m_ip;
}

/**
 * @breaf 与信号QTcpSocket::readyRead信号绑定,异步接收数据
 */
void TCPClient::getMsg(){
    qDebug()<<"read sev data-----------------";
    QByteArray buffer;
    buffer = m_tcpsocket->readAll();/*-<读取数据 */
    emit showMsg(buffer); /*-<触发信号,显示在界面上 */
}

/**
 * @breaf 创建一个TCP连接
 * @param
 * @note
 */
void TCPClient::createTcpConnect(){
    m_tcpsocket->abort();
    m_tcpsocket->connectToHost(m_ip,m_port);/*-<调用connectToHost函数连接指定的IP及端口号 */

    if(!m_tcpsocket->waitForConnected(3000))/*-<调用waitForConnected函数判断是否连接成功,ps:不加这个也能连上 */
    {
        qDebug() << "Connection failed!";
        return;
    }
}

void TCPClient::sendMsg2Sev(const QString msg){
    m_tcpsocket->write(msg.toUtf8()); /*-<调用write函数发送数据 */
    m_tcpsocket->flush();
    /*-< write函数执行后,其实不一定会把数据写入socket,
     * 可能要等到事件循环(main函数的return a.exec())才会写入。
     * 如果需要立即写入,要执行QTcpSocket的flush函数。*/

}
           

Second,再来一个服务端的demo:

1.服务端创建TCP连接的步骤:

  • new一个QTcpServer,再new一个QTcpSocket对象出来
  • 调用QTcpServer的listen监听端口
  • 调用QTcpServer的nextPendingConnection函数获取连接进来的socket
  • 然后剩下的就是绑定各种信号槽

我给服务端也建了一个类,类名为TcpSev,同样在main.cpp中注册了这个类。

2.以下是服务端的demo

我给服务端也建了一个类,类名为TcpSev,同样在main.cpp中注册了这个类。

.h文件

#include <QObject>
#include <QTcpServer>
#include <QTcpSocket>

class TcpSev: public QObject
{
    Q_OBJECT
public:
    TcpSev();
    int getPort(){ return m_port;}
    Q_INVOKABLE void setPort(int port);

    void onConnected();
    void getMsg();
    void onNewConnected();

public slots:
    void listenPort();
    void sendMsg2Client(const QString msg);

signals:
    void showMsg(const QString &msg);

private:
    QTcpServer *m_tcpsev;
    QTcpSocket *m_tcpSocket;
    int m_port;
};
           

.cpp文件

#include "tcpsev.h"
#include <QDebug>

TcpSev::TcpSev()
{
    m_tcpsev = new QTcpServer();
    m_tcpSocket = new QTcpSocket();
    m_port = 111;
    connect(m_tcpsev,&QTcpServer::newConnection,this,&TcpSev::onNewConnected);
}

void TcpSev::setPort(int port){
    m_port = port;
    qDebug()<<"set port!";
}

void TcpSev::listenPort(){
    m_tcpsev->listen(QHostAddress::Any,m_port);
    qDebug()<<"listen-------";
}

void TcpSev::onConnected(){
    qDebug()<<"Already connect the client! ";
}

void TcpSev::getMsg(){
    qDebug()<<"read client data-----------------";
    QByteArray buffer;
    buffer = m_tcpSocket->readAll();
    emit showMsg(buffer);
}

void TcpSev::onNewConnected(){
    qDebug()<<"new connect!";
    m_tcpSocket->abort();
    m_tcpSocket = m_tcpsev->nextPendingConnection();
    qDebug()<<"new connect!"<<m_tcpSocket;
    connect(m_tcpSocket,&QTcpSocket::connected,this,&TcpSev::onConnected,Qt::AutoConnection);
    connect(m_tcpSocket,&QTcpSocket::readyRead,this,&TcpSev::getMsg,Qt::AutoConnection);
}

void TcpSev::sendMsg2Client(const QString msg){
    m_tcpSocket->write(msg.toUtf8());
    m_tcpSocket->flush();
}
           

main.qml中只需要画几个框,填一下端口号、ip地址、调一下类里面的函数,就可以愉快的玩耍了。

放个大招,贡献一下我的源码。

继续阅读