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. 计算机网络自顶向下方法第3章-传输层 (Transport Layer).2

    3.5 面向连接的运输: TCP 3.5.1 TCP连接 TCP是因特网运输层的面向连接的可靠的运输协议. TCP连接提供全双工服务(full-duplex service). TCP连接是点对点的连 ...

  2. 02 Python 函数的一些小笔记

    函数的返回值 1.使用return可以返回多个值,如:return a,b 返回的数据类型是元组型2.接收返回的元组可以如:c,d=demo() (假设demo()返回a,b元组),需要注意的是,接收 ...

  3. wx存储数据到本地及本地获取

    官方文档:https://developers.weixin.qq.com/miniprogram/dev/api/storage/wx.setStorageSync.html 存到本地就是存到手机的 ...

  4. PAT(B) 1093 字符串A+B(Java和C)

    题目链接:1093 字符串A+B (20 point(s)) 题目描述 给定两个字符串 A 和 B,本题要求你输出 A+B,即两个字符串的并集.要求先输出 A,再输出 B,但重复的字符必须被剔除. 输 ...

  5. PAT(B) 1029 旧键盘(Java)字符串

    题目链接:1029 旧键盘 (20 point(s)) 题目描述 旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现.现在给出应该输入的一段文字.以及实际被输入的文字,请你列出肯定坏掉的 ...

  6. 转 实现类似QQ的窗体停靠

    [DllImport("User32.dll")] public static extern bool PtInRect(ref Rectangle Rects, Point lp ...

  7. JS权威指南读书笔记(三)

    第七章 数组 1 数组的实现是经过优化的,用数字索引来访问数组元素一般来说比访问常规的对象属性要快的多. 2 数组直接量的语法允许有可选的结尾的逗号,故[ ; ; ]只有两个元素而非三个. 3 调用构 ...

  8. CSS_引入方式

    一 CSS的引入方式 CSS是Cascading Style Sheets的简称,中文称为层叠样式表,用来控制网页数据的表现,可以使网页的表现与数据内容分离       1.行内式           ...

  9. 虚拟机安装master,克隆slave0、slave1(多台机相连,网络匹配)

    1.在虚拟机中创建一个名叫master的主机 2.创建成功后,打开编辑选项——虚拟网络网络编辑器,填网关 3.打开终端,进入root权限,编写命令 设置虚拟机DNS 4.给master网络配置好后,克 ...

  10. 创建虚拟目录 http://localhost:1001/ 失败,错误: 无法创建网站

    使用vs2015打开一个vs2008项目报错了. 最后网上找到的解决方案, 1,打开编辑xxx.csproj文件: 2,找到节点ProjectExtensions注释掉: 3,重新加载就好了.