当前位置: 首页 > news >正文

Qt中的QTcpSocket、QWebSocket和QLocalSocket

在这里插入图片描述
同时实现了QTcpSocket、QWebSocket和QLocalSocket的简单通讯deamon,支持自动获取本机ip,多个客户端交互。在这个基础上你可以自己加错误检测、心跳发送、包封装解析和客户端自动重连等功能。

获取本机电脑ip:

QString Widget::getIp()
{QString hostName=QHostInfo::localHostName();//主机信息查询:返回本机主机名QHostInfo  hostInfo=QHostInfo::fromName(hostName);//通过主机名称,获取IP地址,返回一个hostInfo类QString    localIP="";//本地IP地址string数组QList<QHostAddress> addList=hostInfo.addresses();//创建一个QList对象,容器内部存储QHostAddress类型的数据,返回一个address数组,QHostAddress类提供一个IP地址的信息,包括IPv4和Ipvif (!addList.isEmpty()){for (int i=0;i<addList.count();i++){QHostAddress aHost=addList.at(i);//访问指定位置的元素//测试//qDebug()<<aHost.toString();if (QAbstractSocket::IPv4Protocol==aHost.protocol())  //protocol()返回IP地址的协议类型,并且只返回IPv4的地址{localIP=aHost.toString();//返回IP地址的字符串break;}}}qDebug()<<localIP;return localIP;
}

tcp服务器连接介绍:
1、定义并创建接收的信号与槽:

//创建tcp服务器对象
m_tcpServer = new QTcpServer(this);
//捕获客户端连接
connect(m_tcpServer,SIGNAL(newConnection()),this,SLOT(slottcpNewConnection()));

2、开启监听ip和端口

m_tcpServer->listen(QHostAddress(ui->tcpip->text()),ui->tcpport->text().toInt());

3、接入连接进来的客户端,并配置接收。

    //获取新的连接对象QTcpSocket *tcpSocket = m_tcpServer->nextPendingConnection();//捕获客户端发送数据的信号connect(tcpSocket,&QTcpSocket::readyRead,this,[&](){QTcpSocket* socket = qobject_cast<QTcpSocket*>(sender());QString val = socket->readAll();});//捕获客户端断开的信号connect(tcpSocket,&QTcpSocket::disconnected,this,[=](){});
}

4、发送数据

  tcpSocket->write(ui->tcpsendedit->text().toLatin1());

tcp客户端连接流程
1、定义并连接ip和端口

    m_tcpSocket = new QTcpSocket(this);m_tcpSocket->connectToHost(QHostAddress(ui->tcpip->text()),ui->tcpport->text().toInt());

2、绑定连接、断开连接和接收的信号与槽

    connect(m_tcpSocket,&QTcpSocket::connected,this,[=](){});connect(m_tcpSocket,&QTcpSocket::disconnected,this,[=](){});connect(m_tcpSocket,&QTcpSocket::readyRead,this,&Widget::slotTcpReadData);

3、发送

    m_tcpSocket->write(ui->tcpsendedit->text().toLatin1());

websocket服务器连接流程
1、定义并创建接收的信号与槽:

    //使用给定的serverName构造一个新的QWebSocketServer。该服务器名称将在HTTP握手阶段被用来识别服务器。它可以为空,此时不会将服务器名称发送给客户端。//SslMode指示服务器是通过wss(SecureMode)还是ws(NonSecureMode)运行。QWebSocketServer::SecureMode服务器以安全模式运行(通过wss);QWebSocketServer::NonSecureMode服务器以非安全模式运行(通过ws)m_webServer = new QWebSocketServer("",QWebSocketServer::NonSecureMode,this);connect(m_webServer,SIGNAL(newConnection()),this,SLOT(slotWebNewConnect()));

2、开启监听ip和端口

    m_webServer->listen(QHostAddress(ui->webip->text()),ui->webport->text().toInt());

3、接入连接进来的客户端,并配置接收。

   QWebSocket* webSocket = m_webServer->nextPendingConnection();connect(webSocket,&QWebSocket::disconnected,this,[=](){});connect(webSocket,&QWebSocket::textMessageReceived,this,[=](QString val){});

4、发送数据

    webSocket>sendTextMessage(ui->websendedit->text());//sendBinaryMessage发送二进制数据。

websocket客户端连接流程
1、定义并连接ip和端口

    m_webSocket = new QWebSocket("");m_webSocket->open(QUrl(QString("ws://%1:%2").arg(ui->webip->text()).arg(ui->webport->text())));

2、绑定连接、断开连接和接收的信号与槽

    connect(m_webSocket,&QWebSocket::connected,this,[=](){});connect(m_webSocket,&QWebSocket::disconnected,this,[=](){});connect(m_webSocket,&QWebSocket::textMessageReceived,this,&Widget::slotwebReadData);

3、发送

    m_webSocket->sendTextMessage(ui->websendedit->text());//sendBinaryMessage发送二进制数据。

本地通信服务器连接流程
1、定义并创建接收的信号与槽:

    //创建本地服务器对象m_localServer = new QLocalServer(this);//捕获客户端连接connect(m_localServer,SIGNAL(newConnection()),this,SLOT(slotlocalnewConnection()));

2、开启监听key值

    QLocalServer::removeServer(m_oldKey);    //删除已有的连接m_localServer->listen(ui->localkey->text());              //监听客户端m_oldKey = ui->localkey->text();

3、接入连接进来的客户端,并配置接收。

    if (m_localServer->hasPendingConnections()){//获取新的连接对象QLocalSocket* localSocket = m_localServer->nextPendingConnection();//捕获客户端发送数据的信号connect(localSocket,&QLocalSocket::readyRead,this,[&](){QLocalSocket* socket = qobject_cast<QLocalSocket*>(sender());QString val = socket->readAll();});//捕获客户端断开的信号connect(localSocket,&QLocalSocket::disconnected,this,[=](){});}

4、发送

   localSocket->write(ui->tcpsendedit->text().toLatin1());

本地通信客户端连接流程
1、定义并连接key值

    m_localSocket = new QLocalSocket(this);m_localSocket->connectToServer(ui->localkey->text(),QIODevice::ReadWrite);

2、绑定连接、断开连接和接收的信号与槽

    connect(m_localSocket,&QLocalSocket::connected,this,[=](){});connect(m_localSocket,&QLocalSocket::disconnected,this,[=](){});connect(m_localSocket,&QLocalSocket::readyRead,this,&Widget::slotlocalReadData);

3、发送

    m_localSocket->write(ui->localsendedit->text().toLatin1());

完整示例代码

http://www.lryc.cn/news/32808.html

相关文章:

  • 枚举学习贴
  • 【C++】30h速成C++从入门到精通(继承)
  • Java多线程还不会的进来吧,为你量身打造
  • 8 神经网络及Python实现
  • 使用QIS(Quantum Image Sensor)图像重建总结(1)
  • 【SpringCloud】SpringCloud教程之Nacos实战(二)
  • 利用Qemu工具仿真ARM64平台
  • 【Hello Linux】进程控制 (内含思维导图)
  • 嵌入式linux物联网毕业设计项目智能语音识别基于stm32mp157开发板
  • 【黄河流域公安院校网络空间安全技能挑战赛】部分wp
  • 五点CRM系统核心功能是什么
  • window.print() 前端实现网页打印详解
  • php程序员应具有的7种能力
  • quarkus 生产环境与k8s集成总结
  • 蓝桥杯训练day2
  • 为什么99%的程序员都做不好SQL优化?
  • Jenkins最新版安装调试
  • 简略说一下go的sync.RWMutex锁
  • 软考马上要报名了,出现这些问题怎么办?
  • 单链表(增删查改)
  • 端口复用(bind error: Address already in use 问题)
  • 数字化引领乡村振兴,VR全景助力数字乡村建设
  • 【数据结构入门】-链表之双向循环链表
  • Jenkins自动化部署入门
  • Springboot 读取模板excel信息内容并发送邮件, 并不是你想想中的那么简单
  • 蓝桥杯真题31日冲刺 |第一天
  • STM32开发(18)----CubeMX配置RTC
  • Qt 单例模式第一次尝试
  • C语言--一维数组
  • DataGear 4.5.1 发布,数据可视化分析平台