QT TCP实现简单的通信示例

 更新时间:2022年08月22日 09:01:39   作者:Licht小粉  
这篇文章主要为大家详细介绍了QT TCP简单的通信示例,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了QT TCP实现简单通信示例的具体代码,供大家参考,具体内容如下

TCP服务端:

第一步: 创建监听套接字的QTcpSever

QTcpServer *m_tsTcpServer;

第二步: listen------监听是否有新的连接进来

int iMyport;如果有新的客户端连接的话,会触发信号newConnection(),定义一个槽函数接收连接好的套接字.

//监听的端口号
iMyport = iPort;
//判断是否接收到了新的连接
if(m_tsTcpServer->listen(QHostAddress::Any,iMyport))
    {
        connect(m_tsTcpServer,SIGNAL(newConnection()),this,SLOT(slotServerNewConnection()));
    }
    else
    {
        qDebug() << "server listen error";
    }

第三步: 取出套接字

QTcpSocket *m_tsTcpSocket; 如果客户端有消息进来的话,会触发信号readyRead();断开连接的话会触发disconnected();

//获得连接客户端的SOCKET套接字
m_tsTcpSocket = m_tsTcpServer->nextPendingConnection();

//获取对方的IP和端口
QString sIp = m_tsTcpSocket->peerAddress().toString();
quint16 sPort = m_tsTcpSocket->peerPort();
qDebug() << sIp << sPort;

connect(m_tsTcpSocket,SIGNAL(readyRead()),this,SLOT(slotServerReadData()));
connect(m_tsTcpSocket, SIGNAL(disconnected()), this, SLOT(slotServerDisConnection()));

第四步: 读取套接字的内容

//从socket中读出数据
QByteArray baArray = m_tsTcpSocket->readAll();
QString sMsg = baArray;

到此服务端简单的通信搭建就完成了.

TCP客户端:

第一步: 创建套接字,与服务端的IP地址和端口号连接.注:这里的端口号和上面服务端绑定的那个端口号是一样的,别搞错了.

//连接服务端
m_tsTcpSocket->connectToHost(sIP,iPort);
//成功连接返回true,错误返回false
if(m_tsTcpSocket->waitForConnected())
    {
        qDebug() << "connect success";
    }
    //成功连接会触发槽函数 如果在找在这个槽函数里写write的话只能写一次,所以可以等连接成功后自己把写的函数放在自己想要发送的模块
    //connect(m_tsTcpSocket,SIGNAL(connected()),this,SLOT(slotConnectedSuccess()));

第二步: 连接成功后就可以直接向服务端发消息了.

QString str;
int iSize = m_tsTcpSocket->write(str.toUtf8().data());//返回字节的大小
//等待write写完再写下一次的write
    if(!m_tsTcpSocket->waitForBytesWritten(50000))
    {
        return;
    }
    //判断发送是否成功
    if(iSize ==-1)
    {
        qDebug() << "write error";
        return;
    }

到此客户端的简单通信就搭建好了.

若要多次向服务端发消息,可以while循环或者是其他.在这里要注意如果要多次发消息的话,waitForBytesWritten()这个函数是必不可少的,不然多次的话可能通信会失败.

注:write()函数和被触发的读的readyRead()信号并不是一一对应的,比如可能你客户端write了三次,服务端那边的readyRead可能才被触发一次.

想要了解详细的原因可以自己再去了解.

同理服务端向客服端发消息的话直接发送就可,服务端要收消息的话也是直接读就好,因为连接已经成功了.
相信小聪明脑袋瓜的你能懂的.

补充:客户端主动断开服务的连接

void TcpClient::disConnectSever()
{
    //方式一
    m_tcpSocket->flush();
    m_tcpSocket->disconnectFromHost();
    
    //方式二
    m_tcpSocket->abort();
}

注:方式二abort与方式一的区别:abort中止当前连接并重置套接字。与disConnectFromHost()不同,该函数会立即关闭套接字,丢弃写缓冲区中的所有挂起数据。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • C语言入门之指针用法教程

    C语言入门之指针用法教程

    这篇文章主要介绍了C语言入门之指针用法教程,主要对C语言中指针的本质及常见用法做了较为通俗易懂的分析,是后续深入学习C语言的基础,需要的朋友可以参考下
    2014-09-09
  • c++使用regex报错regex_error两种解决方案

    c++使用regex报错regex_error两种解决方案

    C++正则表达式是一个非常强大和实用的工具,但是使用它们时需要注意仔细检查代码是否符合语法规则,这篇文章主要给大家介绍了关于c++使用regex报错regex_error的两种解决方案,需要的朋友可以参考下
    2024-03-03
  • 解析C语言中如何正确使用const

    解析C语言中如何正确使用const

    本篇文章是对C语言中如何正确使用const,进行了详细的分析介绍。需要的朋友参考下
    2013-05-05
  • C语言实现静态版通讯录的代码分享

    C语言实现静态版通讯录的代码分享

    这篇文章主要为大家详细介绍了如何利用C语言实现一个简单的静态版通讯录,主要运用了结构体,一维数组,函数,分支与循环语句等等知识,需要的可以参考一下
    2023-01-01
  • DSP中浮点转定点运算--定点数的加减乘除运算

    DSP中浮点转定点运算--定点数的加减乘除运算

    本文主要介绍DSP中定点数的加减乘除运算,很值得学习一下,需要的朋友可以参考一下。
    2016-06-06
  • c语言左移和右移的示例详解

    c语言左移和右移的示例详解

    这篇文章主要介绍了c语言左移和右移的示例详解,移位操作符的两个操作数必须是整型的。整个移位表达式的值的类型也是整型的,而且,左移位操作符与右移位操作符的运算并不对称。
    2020-07-07
  • C++标准库学习之weak_ptr智能指针用法详解

    C++标准库学习之weak_ptr智能指针用法详解

    这篇文章主要为大家详细介绍了C++标准库中weak_ptr智能指针用法的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-12-12
  • 详解c++ 继承

    详解c++ 继承

    这篇文章主要介绍了c++ 继承的相关资料,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • c++11 实现枚举值到枚举名的转换问题

    c++11 实现枚举值到枚举名的转换问题

    这篇文章主要介绍了c++11 实现枚举值到枚举名的转换,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • C语言学生管理系统源码分享

    C语言学生管理系统源码分享

    这篇文章主要为大家分享了C语言学生管理系统的源码,帮助大家学习结构体,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03

最新评论