QLocalServer和QLocalSocket单进程和进程通信
QLocalServer
继承自QObject。
QLocalServer提供了一个基于本地套接字(socket)的服务端(server)。
QLocalServer可以接受来自本地socket的连接。
server通过调用listen(),监听特定的连接。
newConnection()是在每次server与client连接上时所发出的信号。
nextPendingConnection()将等待中的连接当作一个已连接上的QLocalSocket。返回值是指向QLocalSocket的指针,这个QLocalSocket可以与client建立通信。
当发生错误时,serverError() 返回错误的类型,调用errorString()可以获取对错误的描述。
在监听过程中,通过 serverName()可以获取当前server监听的名称。
close()使QLocalServer停止对连接请求的监听。
虽然QLocalServer是为在事件循环中使用而设计出来的,但是在没有事件循环时也是可以使用的。没有事件循环时,你必须使用waitForNewConnection(),它只在以下两种情况下解除阻塞:1)有可用的连接;2)超时。
1. 建立一个QLocalServer实例 m_server
m_server->listen("servername")
connect(m_server, SIGNAL(newConnection()), this, SLOT(newConnection()));
QLocalSocket *newsocket = m_server->nextPendingConnection();
// 取得是哪个localsocket可以读数据了
QLocalSocket *local = static_cast<QLocalSocket *>(sender());
if (!local)
return;
QTextStream in(local);
QString readMsg;
// 读出数据
readMsg = in.readAll();
全部代码, server端:
全部代码, server端: ////////////////////////////////////////////////////////////////////////////////
// server.h
/////////////////////////////////////////////////////////////////////////////////
#ifndef SERVER_H
#define SERVER_H
#include <QLocalServer>
#include <QLocalSocket>
class Server : public QObject
{
Q_OBJECT
public:
Server()
{
m_server = ;
}
~Server()
{
if (m_server)
{
delete m_server;
}
}
int init(const QString & servername)
{
// 如果已经有一个实例在运行了就返回0
if (isServerRun(servername)) {
return ;
}
m_server = new QLocalServer;
// 先移除原来存在的,如果不移除那么如果
// servername已经存在就会listen失败
QLocalServer::removeServer(servername);
// 进行监听
m_server->listen(servername);
connect(m_server, SIGNAL(newConnection()), this, SLOT(newConnection()));
return ;
}
private slots:
// 有新的连接来了
void newConnection()
{
QLocalSocket *newsocket = m_server->nextPendingConnection();
connect(newsocket, SIGNAL(readyRead()), this, SLOT(readyRead()));
}
// 可以读数据了
void readyRead()
{
// 取得是哪个localsocket可以读数据了
QLocalSocket *local = static_cast<QLocalSocket *>(sender());
if (!local)
return;
QTextStream in(local);
QString readMsg;
// 读出数据
readMsg = in.readAll();
// 发送收到数据信号
emit newMessage(readMsg);
}
private:
// 判断是否有一个同名的服务器在运行
int isServerRun(const QString & servername)
{
// 用一个localsocket去连一下,如果能连上就说明
// 有一个在运行了
QLocalSocket ls;
ls.connectToServer(servername);
if (ls.waitForConnected()){
// 说明已经在运行了
ls.disconnectFromServer();
ls.close();
return ;
}
return ;
}
signals:
void newMessage(const QString &msg);
private:
QLocalServer *m_server;
};
#endif // SERVER_H
///////////////////////////////////////////////////////////////////////
/// main.cpp
///////////////////////////////////////////////////////////////////////
#include <QApplication>
#include <QLabel>
#include <QMessageBox>
#include "server.h"
int main(int argc, char **argv)
{
QApplication app(argc, argv);
QLabel text("teststts");
Server s;
if (!s.init("localserver-test")){
// 初使化失败, 说明已经有一个在运行了
QMessageBox::information(&text, "info", "There is already exist one!");
return ;
}
QObject::connect(&s, SIGNAL(newMessage(const QString &)),&text, SLOT(setText(const QString &)));
text.show();
return app.exec();
}
用于测试的客户端代码, 每一秒向server发送一个随机数:
用于测试的客户端代码, 每一秒向server发送一个随机数: #include <QLocalSocket>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char **argv)
{
QLocalSocket ls;
ls.connectToServer("localserver-test");
srandom();
if (ls.waitForConnected()){
while (){
QTextStream ts(&ls);
ts << QString::number(random()) + "\nTTTTTTTTTT" + "\nXXXXXXXX";
ts.flush();
ls.waitForBytesWritten();
sleep();
}
}
return ;
}
QLocalServer和QLocalSocket单进程和进程通信的更多相关文章
- QLocalServer与QLocalSocket进程通讯
在Qt中,提供了多种IPC方法,作者所用的是QLocalServer和QLocalSocket.看起来好像和Socket搭上点边,实则底层是windows的name pipe.这应该是支持双工通信的. ...
- Linux学习笔记(13)-进程通信|命名管道
匿名管道只能在具有亲属关系的进程间通信,那么如果想要在不具有亲戚关系,想在陌生人之间通信,那又该怎么办呢? 别慌,Linux身为世界上*强大的操作系统,当然提供了这种机制,那便是命名管道-- 所谓命名 ...
- Android随笔之——跨进程通信(一) Activity篇
在Android应用开发中,我们会碰到跨进程通信的情况,例如:你用QQ通讯录打电话的时候会调用系统的拨号应用.某些新闻客户端可以将新闻分享到QQ.微信等应用,这些都是跨进程通信的情况.简而言之,就是一 ...
- Android 进程通信机制之 AIDL
什么是 AIDL AIDL 全称 Android Interface Definition Language,即 安卓接口描述语言.听起来很深奥,其实它的本质就是生成进程间通信接口的辅助工具.它的存在 ...
- Windows进程通信 -- 共享内存(1)
共享内存的方式原理就是将一份物理内存映射到不同进程各自的虚拟地址空间上,这样每个进程都可以读取同一份数据,从而实现进程通信.因为是通过内存操作实现通信,因此是一种最高效的数据交换方法. 共享内存在 W ...
- MINIX3 进程通信分析
MINIX3 进程通信分析 6.1MINIX3 进程通信概要 MINIX3 的进程通信是 MINIX3 内核部分最重要的一个部件,我个人认为其实这 是内核中的“内核”,怎么来理解这个概念呢?其实 MI ...
- Linux系统编程@进程通信(一)
进程间通信概述 需要进程通信的原因: 数据传输 资源共享 通知事件 进程控制 Linux进程间通信(IPC)发展由来 Unix进程间通信 基于System V进程间通信(System V:UNIX系统 ...
- Linux下进程通信的八种方法
Linux下进程通信的八种方法:管道(pipe),命名管道(FIFO),内存映射(mapped memeory),消息队列(message queue),共享内存(shared memory),信号量 ...
- WinForm实现跨进程通信的方法
public class WinMessageHelper { private struct COPYDATASTRUCT { public IntPtr dwData; public int cbD ...
随机推荐
- Flutter Dialog 屏蔽返回键
使用 WillPopScope + Future.value(false); 屏蔽返回键.代码如下: showDialog<Null>( context: context, // Buil ...
- Shiro源码解析-Session篇
上一篇Shiro源码解析-登录篇中提到了在登录验证成功后有对session的处理,但未详细分析,本文对此部分源码详细分析下. 1. 分析切入点:DefaultSecurityManger的login方 ...
- Python——免费观看全网视频小程序
说明,这个小程序是基于网站“全民解析”,调用该网站的接口,实现数据传输观看视频,若该网站凉凉,则此程序凉凉. 开始之前的分析: 进入全民解析网站,我们首先查看一下网页的html代码,发现该站观看视频的 ...
- ios模拟器安装测试包方法
1. 使用ios-sim ios-sim是一个可以用命令空着ios模拟器的工具.利用这个命令,我们可以启动模拟器.安装app.启动app.查询ios sdk,它可以使我们像自动化测试一样打开xcode ...
- CDH集群安装配置(四)- mysql 的安装
安装mysql,并且创建相关的表(只需要在chd1上面安装而且需要root权限)1.1 查看Centos自带mysql是否已经安装 yum list installed | grep mysql 卸载 ...
- sort sorted() reverse() reversed() 的区别1
sort()是可变对象(字典.列表)的方法,无参数,无返回值,sort()会改变可变对象,因此无需返回值.sort()方法是可变对象独有的方法或者属性,而作为不可变对象如元组.字符串是不具有这些方法的 ...
- vue element 常见问题
1. vue2.0 给data对象新增属性,并触发视图更新 $set this.$set(this.ossData, "signature", 222) // 正确用法 // 数 ...
- (转)Linux-HA实战(1)— Heartbeat安装
原文:http://blog.csdn.net/liaomin416100569/article/details/76087448-------centos7源代码编译安装heartbeat 原文:h ...
- 远控项目(Windows Socket)
实现内容(屏幕,鼠标,键盘实时控制) 控制端: #pragma once #ifndef keybd_H #define keybd_H #include <stdio.h> #inclu ...
- Java String StringBuilder StringBuffer
String是字符串常量 StringBuilder和StringBuffer都是字符串变量 速度方面:StringBuilder > StringBuffer > String 每当用S ...