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 ...
随机推荐
- Java中的RSA加解密工具类:RSAUtils
本人手写已测试,大家可以参考使用 package com.mirana.frame.utils.encrypt; import com.mirana.frame.utils.log.LogUtils; ...
- Python学习 day12
一.@wraps __name__ 查看函数的名字 __doc__ 查看函数的文档字符串 例: def func(arg): """ 这是一个测试函数,这里是函 ...
- 计算机网络c++实现截断二进制指数退避算法
#include<iostream> #include<vector> #include <stdio.h> #include<stdlib.h> // ...
- 《JavaScript编程精解》读书笔记
第一章 JavaScript基础:值.变量.控制流程 JavaScript里有六种基本类型:number类型.string类型.boolean类型.object.function和undefined. ...
- Http请求响应模型
主要用到以下四个部分: Client API DB API 场景:登录 1.Client发起请求到API接口层 1.1用户在客户端输入登录信息,点击登录,发送请求 2.API接受用户发起的 ...
- ios UISearchDisplayController 实现 UITableView 搜索功能
UISearchDisplayController 是苹果专为 UITableView 搜索封装的一个类. 里面内置了一个 UITableView 用于显示搜索的结果.它可以和一个需要搜索功能的 co ...
- unity 解决与永久解决行尾不一致报警
虽然不影响使用,但一堆警告信息着实让人不爽,继续往下看. 用Notepad2的“查看->显示换行编码"查看发现通过Unity3D编辑器创建的脚本文件是以"LF"结尾 ...
- PHP读取文件的多种方法
1.传统的方法 fopen, fclose feof:file.end of file 例子: $file_handle = fopen("c:\\myfile.txt", &qu ...
- VS2008默认的字体居然是 新宋体
本人还是觉得 C#就是要这样看着舒服
- Js的小技巧
感谢好友破狼提供的这篇好文章,也感谢写这些知识点的作者们和将他们整理到一起的作者.这是github上的一篇文章,在这里本兽也就只做翻译,由于本兽英语水平和编程能力都不咋地,如有不好的地方也请多理解体谅 ...