Qt很强大,但是Qt的帮助文档、API属实是让我们走不少弯路。QLocalSocket一个很简单的东西,我仅想用来实现一个简单的本地进程通信,就遇到了:客户端循环发送数据,服务端只能接收到一条、接收到数据不完整等奇奇怪怪的现象。
最郁闷的是,网上很多教程说的都是错的😒。
我的应用场景就是很简短的报文发送,最大几K、几十K。每个报文需要独立,因为我不想再处理拆包,粘包等问题🫠。
//
QLocalSocket 是一个基于流的 IPC(进程间通信) 套接字。它允许我们通过本地套接字在同一台主机上的两个进程之间传输数据流。
与TCP、UDP一样也分服务端和客户端。Qt的QLocalSocket在windows上底层实现是管道,在unix上实现是本地域socket。
本项目是服务端,服务端的创建代码如下:
第一步,new QLocalServer对象
第二步,监听连接名
第三步,连接并实现客户端连接信号的槽函数
第四步,连接到来时获取连接套接字
第五步,连接并实现客户端断开连接信号的槽函数
第六步,连接并实现消息到来取消息的槽函数
第七步,读全部数据,打印
上面的流程,采用connect机制,全异步方式处理信号,没有阻塞等待
三个connect 分别处理:客户端连接、接收到数据、客户端断开连接的消息or信号。
// 注意事项
上面服务端的建立是写在了ui的构造函数里面,如果信号多的情况,ui是会卡顿,因为事件循环还是在一个主线程里面。
QLocalServer * pLocalServer = new QLocalServer(this); //第一步,new 对象
if (pLocalServer == nullptr)
{
qCritical() << __FILE__ << __LINE__ << "pLocalServer is nullptr!";
}
else
{
if (pLocalServer->listen(LOACL_SOCKE