2024年C C++最全QT - 创建TCP Socket通信_qt tcpsocket,新鲜出炉的蚂蚁金服面经

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

QT创建TCP Socket通信

最近在学习QT,了解到QT可以进行SOCKET网络通信,进行学习,并建立一个简单的聊天DEMO。为了测试是否能与VS2012下的程序进行通信,在VS2012下建立一个客户端程序,进行通信测试,发现可以进行通信。由此也可以证明,对于采用同一种通信协议(TCP)的两个程序而言,不管是采用什么编译器,尽管采用的语法不同,仍是能够进行通信的。下面先对QT的TCP通信机制进行简单的介绍,然后再介绍基于QT的聊天DEMO具体的实现过程;最后介绍与VS2012下的程序通信。

1、QT的TCP Socket通信机制

QT的TCP Socket通信仍然有服务端、客户端之分。服务端通过监听某个端口来监听是否有客户端连接到来,如果有连接到来,则建立新的SOCKET连接;客户端通过IP和PORT连接服务端,当成功建立连接之后,就可进行数据的收发了。需要注意的是,在QT中,QT把SOCKET当成输入输出流来对待的,数据的收发是通过read()和write()来进行的,需要与我们常见的send()与recv()进行区分。

要在QT进行SOCKET通信,需要在 工程名.pro文件中输入 QT       += network,如下所示:

a):服务端通信机制

在服务端,建立SOCKET通信需要用到两个类QTcpServer和QTcpSocket。其中QTcpServer是用来建立QT的Server端对象,QTcpSocket是用来建立SOCKET通信的Socket套接字对象。通信建立流程如下所示:

1):建立QTcpServer类的对象
QTcpServer* mp_TCPServer ;
mp_TCPServer = new QTcpServer();
2):监听

QT中,通过listen()建立对端口的监听。使用方式如下:mp_TCPServer->listen(地址类型, 端口号);

int port = ui->m_portLineEdit->text().toInt();	//获得端口号
if(!mp_TCPServer->listen(QHostAddress::Any, port))
{
     QMessageBox::information(this, "QT网络通信", "服务器端监听失败!");
     return;
}

其中,QHostAddress定义了集中特殊的IP地址,如

QHostAddress::Null表示一个空地址;

QHostAddress::LocalHost表示IPv4的本机地址127.0.0.1;

QHostAddress::LocalHostIPv6表示IPv6的本机地址;

QHostAddress::Broadcast表示广播地址255.255.255.255;

QHostAddress::Any表示IPv4的任意地址;

QHostAddress::AnyIPv6表示IPv6的任意地址。

3):关联接收连接信号与槽函数

服务端通过信号 SIGNAL:newConnection() 来判断是否接收到了新的连接,当服务端接收到一个客户端的连接时,就会触发信号newConnection(),此时调用相应的槽函数(如自定义函数:ServerNewConnection())保存新接收到的连接;所以需要在服务端监听端口之后建立信号与槽函数的连接。通过connect函数建立联系:

connect(mp_TCPServer, SIGNAL(newConnection()), this, SLOT(ServerNewConnection()));

在ServerNewConnection()函数中,通过nextPendingConnection()函数获得连接客户端的SOCKET套接字:

mp_TCPSocket = mp_TCPServer->nextPendingConnection();
4):接收数据

在QT中QT通过信号SIGNAL:readyRead()来判断是否有数据传入,当客户端向服务端成功发送数据之后,就会在服务端触发readyRead()信号,此时通过调用相应的自定义的槽函数(如:ServerReadData())保存接收到的数据;通过connect函数建立信号readyRead()与槽函数ServerReadData()的连接:

connect(mp_TCPSocket, SIGNAL(readyRead()), this, SLOT(ServerReadData()));

在接收函数ServerReadData()函数中通过read()函数获取数据:

mp_TCPSocket->read(buffer, 1024);

需要注意的是read()函数有多个重载函数,保存接收数据的数据类型可以是QByteArray也可以是char*类型,根据个人习惯或者任务需求选择合适的read()函数。不过,为了保持一致性,建议选择char*类型,一是因为数据类型容易识别;二是因为熟悉C\C++语言开发的对char*应该比较熟悉,防止使用上的错误。

5):发送数据

在QT中,通过write函数向外部发送数据:

int sendRe = mp_TCPSocket->write(sendMsgChar, strlen(sendMsgChar));
if( -1 == sendRe)
{
   QMessageBox::information(this, "QT网络通信", "服务端发送数据失败!");
}

b):客户端通信机制

客户端的通信机制与服务端相比要相对简单,只用到了QTcpSocket一个类。

1):建立QTcpSocket类的对象

建立Socket的套接字:

QTcpSocket* mp_clientSocket;
mp_clientSocket = new QTcpSocket();
2):连接服务端

客户端通过connectToHost(IP, Port)函数连接服务端

mp_clientSocket->connectToHost(ip, port);
3):接收数据

客户端接收数据与服务端接收数据的机制是相同的。通过readyRead()信号是否被触发来判断是否有数据传入,如果该信号被触发,则调用自定义函数(如:ClientRecvData())来保存接收到的数据。通过connect()函数,将信号readyRead()与槽函数ClientRecvData()建立映射关系。

在槽函数ClientRecvData()中通过read()函数接收数据,具体使用方法请参考服务端接收数据

4):发送数据

客户端发送数据也是通过write()函数来实现,具体使用方法请参考服务端发送数据

2、QT基于TCP Socket的通信实例

该部分主要是DEMO的具体实现。

a):服务端示例

1):在sockettcpserver.h中添加具体如下代码:
private:
    Ui::SocketTCPServer *ui;

    QTcpServer *mp_TCPServer;
    QTcpSocket *mp_TCPSocket;
private slots:

    void OnBtnInitSocket();
    void OnBtnSendData();
    void ServerReadData();
    void ServerNewConnection();
    void sServerDisConnection();
2):在构造函数中添加如下代码:
ui->m_portLineEdit->setText("5550");
    connect(ui->m_initSocketBtn, SIGNAL(clicked()), this, SLOT(OnBtnInitSocket()));
    connect(ui->m_sendData, SIGNAL(clicked()), this, SLOT(OnBtnSendData()));
3):ServerNewConnection()具体实现:
//获取客户端连接
    mp_TCPSocket = mp_TCPServer->nextPendingConnection();
    if(!mp_TCPSocket)
    {
        QMessageBox::information(this, "QT网络通信", "未正确获取客户端连接!");
        return;
    }
    else
    {
        QMessageBox::information(this, "QT网络通信", "成功接受客户端的连接");
        connect(mp_TCPSocket, SIGNAL(readyRead()), this, SLOT(ServerReadData()));
        connect(mp_TCPSocket, SIGNAL(disconnected()), this, SLOT(sServerDisConnection()));
    }
4):ServerReadData()具体实现:
char buffer[1024] = {0};
    mp_TCPSocket->read(buffer, 1024);
    if( strlen(buffer) > 0)
    {
        QString showNsg = buffer;
        ui->m_recvDataTextEdit->append(showNsg);
    }
    else
    {
        QMessageBox::information(this, "QT网络通信", "未正确接收数据");
        return;
    }
5):OnBtnInitSocket()具体实现:
mp_TCPServer = new QTcpServer();
    int port = ui->m_portLineEdit->text().toInt();
    if(!mp_TCPServer->listen(QHostAddress::Any, port))
    {
        QMessageBox::information(this, "QT网络通信", "服务器端监听失败!");
        return;
    }
    else
    {
        QMessageBox::information(this, "QT网络通信", "服务器监听成功!");
    }
    connect(mp_TCPServer, SIGNAL(newConnection()), this, SLOT(ServerNewConnection()));


![img](https://img-blog.csdnimg.cn/img_convert/9a4687caba628223922b1d90633dac9e.png)
![img](https://img-blog.csdnimg.cn/img_convert/f5b43e8f9a851e86526ef1553893e25d.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618668825)**

img-JBPUGsDt-1715529848303)]
[外链图片转存中...(img-0yVO5HH9-1715529848303)]

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618668825)**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值