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. C语言的关键字和数据类型

    C语言关键字 C语言数据类型

  2. Docker从入门到掉坑(五):继续挖一挖 k8s

    在之前的几篇文章中,主要还是讲解了关于简单的docker容器该如何进行管理和操作及k8s上手避坑,在接下来的这篇文章开始,我们将继续对k8s模块的学习 pod是啥 在k8s里面,有很多新的技术概念,其 ...

  3. 表单送件前的Check(二) (未完)

    #region 新增表单前的Check动作 public static void NewFormRequestCheck(string _FormID, string _VocaEmpID, stri ...

  4. 【转】使用Scanner输入字符串时next()和nextLine()区别

    在实现字符窗口的输入时,很多人更喜欢选择使用扫描器Scanner,它操作起来比较简单.在编程的过程中,我发现用Scanner实现字符串的输入有两种方法,一种是next(),一种nextLine(),但 ...

  5. python识别文字tesseract

    Ubuntu版本: .tesseract-ocr安装 sudo apt-get install tesseract-ocr .pytesseract安装 sudo pip install pytess ...

  6. django 发帖时碰到的图片上传

    所用编辑器 [wangEditor.js] 图片上传接口 '/edit/image/' 返回内容  参照 https://www.kancloud.cn/wangfupeng/wangeditor3/ ...

  7. java基本数据类型包装

    1. 2. 左边的是对象,自动装箱为对象,右边的是基本的数据类型. 3. 如果m,n换成128就超出范围,结果就不一样. 是因为把在这区间内的值都放在了常量池里面. Integer m = Integ ...

  8. mysql案例分析

    工作中,需要设计一个数据库存储,项目的需求大致如下: (1)对于每个用户,需要存储一个或多个库, 每个库, 由一个用户标识来标识,这里成为clientFlag. (2) 对于每一个库,结构如下: 1) ...

  9. pyhton中map和reduce

    from functools import reduce import numpy as np ''' reduce[function, sequence[, initial]]使用 1.functi ...

  10. HBase hbase-site.xml 参数

    该文档是用hbase默认配置文件生成的,文件源是 hbase-default.xml. 在实际的HBase生产环境中应用于%HBASE_HOME%/conf/hbase-site.xml中. hbas ...