QIODevice做为QLocalSocket的父类

在Qt中,提供了多种IPC方法。看起来好像和Socket搭上点边,实则底层是windows的name pipe。这应该是支持双工通信的

QLocalServer提供了一种基于本地套接字的服务器,实现了接收本地socket的连接的功能。

通过调用listen()监听特定的连接,每次与client连接上时发出newConnection()信号。

通过调用nextPendingConnection()响应一个等待中的连接请求,返回一个指针,指向用于与client建立通信的QLocalSocket。

当连接发生错误时,serverError() 返回错误的类型,通过调用errorString()可以获取错误描述。

监听过程中,serverName()可获取当前服务器的名称。

调用close()停止对连接请求的监听。

虽然QLocalServer是为在事件循环中使用而设计出来的,但是在没有事件循环时也是可以使用的。

没有事件循环时,你必须使用waitForNewConnection(),它只在以下两种情况下解除阻塞:1)有可用的连接;2)超时。

服务器

#ifndef SERVER_H
#define SERVER_H #include <QWidget>
#include <QObject>
#include <QLocalSocket>
#include <QLocalServer> class CServer : public QObject
{
Q_OBJECT public:
CServer() : m_server(NULL)
{
m_server = new QLocalServer;
connect(m_server, SIGNAL(newConnection()), SLOT(serverNewConnectionHandler()));
} ~CServer()
{
m_server->close();
delete m_server;
} void RunServer()
{
qDebug() << "Run Server ok"; QLocalServer::removeServer("ServerName");
bool ok = m_server->listen("ServerName");
if (!ok)
{
// TODO:
}
} private slots:
void serverNewConnectionHandler()
{
qDebug() << "New Connection";
qDebug() << "listen: " << m_server->serverName(); QLocalSocket* socket = m_server->nextPendingConnection();
connect(socket, SIGNAL(readyRead()), this, SLOT(socketReadyReadHandler()));
connect(socket, SIGNAL(disconnected()), socket, SLOT(deleteLater()));
} void socketReadyReadHandler()
{
QLocalSocket* socket = static_cast<QLocalSocket*>(sender());
if (socket)
{
QTextStream stream(socket);
qDebug() << "Read Data From Client:" << stream.readAll(); QString response = "Hello Client";
socket->write(response.toUtf8());
socket->flush();
}
// 返回到客户端的void sendMessage 方法,m_socket->waitForReadyRead()之后的操作
} private:
QLocalServer *m_server; }; #endif // SERVER_H #include "server.h"
#include <QApplication> int main(int argc, char *argv[])
{
QApplication a(argc, argv); CServer server;
server.RunServer(); return a.exec();
}

客户端

#ifndef CLIENT_H
#define CLIENT_H #include <QObject>
#include <QLocalSocket>
#include <QLocalServer> class CClient : public QObject
{
Q_OBJECT public:
CClient() : m_socket(NULL)
{
m_socket = new QLocalSocket(); connect(m_socket, SIGNAL(connected()), SLOT(socketConnectedHandler()));
connect(m_socket, SIGNAL(disconnected()), SLOT(socketDisConnectedHandler()));
connect(m_socket, SIGNAL(error(QLocalSocket::LocalSocketError)), SLOT(socketErrorHandler(QLocalSocket::LocalSocketError)));
} ~CClient()
{
m_socket->disconnectFromServer();
delete m_socket;
} public:
void ConnectToServer(const QString &strServerName)
{
// serverNewConnectionHandler 成员方法将被调用
m_socket->connectToServer(strServerName);
if (m_socket->waitForConnected())
{
// TODO:
}
} void sendMessage(const QString &msg)
{
m_socket->write(msg.toStdString().c_str());
m_socket->flush(); if (!m_socket->bytesAvailable())
m_socket->waitForReadyRead(); QTextStream stream(m_socket);
QString respond = stream.readAll();
qDebug() << "Read Data From Server:" << respond;
} private slots:
void socketConnectedHandler()
{
qDebug() << "connected.";
} void socketDisConnectedHandler()
{
qDebug() << "disconnected.";
} void socketErrorHandler(QLocalSocket::LocalSocketError error)
{
qWarning() << error;
} private:
QLocalSocket *m_socket; }; #endif // CLIENT_H #include "client.h"
#include <QApplication> int main(int argc, char *argv[])
{
QApplication a(argc, argv); CClient client;
client.ConnectToServer("ServerName"); client.sendMessage("Hellow Server"); return a.exec();
}

学习地址https://blog.csdn.net/yhc166188/article/details/80756448

QLocalSocket的更多相关文章

  1. Qt之QLocalSocket

    简述 QLocalSocket类提供了一个本地socket. 在Windows中,这是一个命名管道:在Unix中,这是一个本地网域socket. 如果发生错误,socketError()会返回错误的类 ...

  2. QLocalServer和QLocalSocket单进程和进程通信

    QLocalServer 继承自QObject. QLocalServer提供了一个基于本地套接字(socket)的服务端(server).QLocalServer可以接受来自本地socket的连接. ...

  3. QLocalServer与QLocalSocket进程通讯

    在Qt中,提供了多种IPC方法,作者所用的是QLocalServer和QLocalSocket.看起来好像和Socket搭上点边,实则底层是windows的name pipe.这应该是支持双工通信的. ...

  4. Android学习第二天-android常用命令

    上一篇文章中,我们重点讲解了adb的常用命令,下面我们一起来看看其它常用的命令 2 android 2.1 查看机器上所有已经安装的Android版本和AVD设备 2.1.1查看机器上已经安装的AVD ...

  5. Qt 多线程和网络编程学习

    一,Qt多线程类学习 QThread类,开始一个新的线程就是开始执行重新实现QThread::run(),run()是默认现实调用exec(),QThread::start()开始线程的执行,run( ...

  6. 《Qt 实战一二三》

    简介 "我们来自Qt分享&&交流,我们来自Qt Quick分享&&交流",不管你是笑了,还是笑了,反正我们是认真的.我们就是要找寻一种Hold不住的 ...

  7. Qt实现应用程序单实例运行--LocalServer方式

    使Qt应用程序能够单实例运行的典型实现方法是使用共享内存实现.该方法实现简单,代码简洁. 但有一个致命缺陷:共享内存(QSharedMemory)实现的单程序运行,当运行环境是UNIX时,并且程序不幸 ...

  8. Qt之运行一个实例进程

    简述 发布程序的时候,我们往往会遇到这种情况: 只需要用户运行一个实例进程 用户可以同时运行多个实例进程 一个实例进程的软件有很多,例如:360.酷狗- 多个实例进程的软件也很多,例如:Visual ...

  9. Qt之进程间通信(TCP/IP)

    简述 可以通过Qt提供的IPC使用TCP/IP,使用QtNetwork模块即可实现,TCP/IP在实现应用程序和进程内部通信或与远程进程间的通信方面非常有用. QtNetwork模块提供的类能够创建基 ...

随机推荐

  1. WUSTOJ 1304: 最大最小公倍数(Java)

    题目链接:

  2. 机器学习之Bagging与随机森林笔记

    集成学习通过将多个学习器进行结合,常可获得比单一学习器显著优越的泛化性能.这对“弱学习器”尤为明显,因此集成学习的很多理论研究都是针对弱学习器进行的,而基学习器有时也被直接称为弱学习器.虽然从理论上来 ...

  3. javascript之instanceof

    定义和用法 instanceof 运算符用来检测 constructor.prototype 是否存在于参数 object 的原型链上. 语法: object instanceof construct ...

  4. flutter从入门到精通一

    Flutter 是 Google 开源的 UI 工具包,帮助开发者通过一套代码库高效构建多平台精美应用,支持移动.Web.桌面和嵌入式平台 flutter是基于dart语言开发的,我们将首先通过几章节 ...

  5. OOM与StackOverFlow发生的原因及解决办法【待完成】

    1,Out Of Memery 内存耗尽 1,1 产生原因 1.1.1 内存用完[堆内存] package com.cnblogs.mufasa; import org.junit.Test; imp ...

  6. Linux下OpenSSL加密解密压缩文件(AES加密压缩文件)

    OpenSSL是一个开源的用以实现SSL协议的产品,它主要包括了三个部分:密码算法库.应用程序.SSL协议库.Openssl实现了SSL协议所需要的大多数算法.下面介绍使用Openssl进行文件的对称 ...

  7. JavaScript 基础(数据类型、函数、流程控制、对象)

    一.JavaScript概述 1.1 JavaScript的历史 1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中).后将其改名Script ...

  8. MySQL性能测试调优

    MySQL性能测试调优 操作系统 基本操作 查看磁盘分区mount选项 $ mount 永久修改分区mount选项(系统重启后生效) 修改文件 /etc/fstab 中对应分区的mount optio ...

  9. python之统计字符串中字母出现次数

    dic=dict() d={} s=set() s='helloworld' (1)d=dict() for x in s: if x not in d.keys(): d[x]=1 else: d[ ...

  10. springcloud源码解析(目录)

    springcloud是一个基于springboot的一站式企业级分布式应用开发框架.springboot为其提供了创建单一项目的便利性,springcloud组合了现有的.常用的分布式项目的解决方案 ...