QLocalServer和QLocalSocket单进程和进程通信
2016-05-18 15:10
323 查看
描述:
QLocalServer 继承自QObject。QLocalServer提供了一个基于本地套接字(socket)的服务端(server)。它可以接受来自本地socket的连接。server通过调用listen(),监听特定的连接。newConnection()是在每次server与client连接上时所发出的信号。nextPending- Connection()将等待中的连接当作一个已连接上的QLocalSocket。返回值是指向QLocalSocket的指针,这个QLocalSocket可以与client建立通信。当发生错误时,serverError() 返回错误的类型,调用errorString()可以获取对错误的描述。 在监听过程中,通过 server- Name()可以获取当前server监听的名称。close()使QLocalServer停止对连接请求的监听。虽然QLocalServer是为在事件循环中使用而设计出来的,但是在没有事件循环时也是可以使用的。
注意:没有事件循环时,你必须使用waitForNewConnection(),它只在以下两种情况下解除阻塞:1)有可用的连接;2)超时。
在Qt中,提供了多种IPC方法,QLocalServer和QLocalSocket算是其一。它的表现看起来好像和Socket搭上点边,实际它的底层是windows的name pipe(有名管道(QLocalSocket))。它是支持全双工通信的。QLocalServer主要用来监听某个管道。建立一个监听可以这样做:
(如下)
建立实例:
1. 建立一个QLocalServer实例
2. 进行listen :
3.当有连接到来时,QLocalServer会发送netConnection()信号,所以进行信号连接, 在init()函数中:
4.在newConnection()函数中取得连接客户端的QLocalSocket
5.当QLocalSocket可以读数据时它会发送readyRead()信号,所以对newsocket进行信号连接, 在newConnection()函数中:
6.在readyRead()函数中读取数据:
// 取得是哪个localsocket可以读数据了
全部代码, server端:
// server.h
///////////////////////////////////////////////////////////////////////
/// main.cpp
///////////////////////////////////////////////////////////////////////
先运行server程序, 然后运行测试用的客户端…
本来参照 http://www.aiuxian.com/article/p-3105197.html
http://blog.chinaunix.net/uid-20718335-id-1993073.html 加以修改和实现
QLocalServer 继承自QObject。QLocalServer提供了一个基于本地套接字(socket)的服务端(server)。它可以接受来自本地socket的连接。server通过调用listen(),监听特定的连接。newConnection()是在每次server与client连接上时所发出的信号。nextPending- Connection()将等待中的连接当作一个已连接上的QLocalSocket。返回值是指向QLocalSocket的指针,这个QLocalSocket可以与client建立通信。当发生错误时,serverError() 返回错误的类型,调用errorString()可以获取对错误的描述。 在监听过程中,通过 server- Name()可以获取当前server监听的名称。close()使QLocalServer停止对连接请求的监听。虽然QLocalServer是为在事件循环中使用而设计出来的,但是在没有事件循环时也是可以使用的。
注意:没有事件循环时,你必须使用waitForNewConnection(),它只在以下两种情况下解除阻塞:1)有可用的连接;2)超时。
在Qt中,提供了多种IPC方法,QLocalServer和QLocalSocket算是其一。它的表现看起来好像和Socket搭上点边,实际它的底层是windows的name pipe(有名管道(QLocalSocket))。它是支持全双工通信的。QLocalServer主要用来监听某个管道。建立一个监听可以这样做:
(如下)
建立实例:
1. 建立一个QLocalServer实例
m_server
2. 进行listen :
m_server->listen("servername")
3.当有连接到来时,QLocalServer会发送netConnection()信号,所以进行信号连接, 在init()函数中:
connect(m_server, SIGNAL(newConnection()), this, SLOT(newConnection()));
4.在newConnection()函数中取得连接客户端的QLocalSocket
QLocalSocket *newsocket = m_server->nextPendingConnection();
5.当QLocalSocket可以读数据时它会发送readyRead()信号,所以对newsocket进行信号连接, 在newConnection()函数中:
connect(newsocket, SIGNAL(readyRead()), this, SLOT(readyRead()));
6.在readyRead()函数中读取数据:
// 取得是哪个localsocket可以读数据了
QLocalSocket *local = static_cast<QLocalSocket *>(sender()); if (!local) return; QTextStream in(local); QString readMsg; // 读出数据 readMsg = in.readAll();
全部代码, server端:
// server.h
#ifndef SERVER_H #define SERVER_H #include <QLocalServer> #include <QLocalSocket> class Server : public QObject { Q_OBJECT public: Server() { m_server = 0; } ~Server() { if (m_server) { delete m_server; } } int init(const QString & servername) { // 如果已经有一个实例在运行了就返回0 if (isServerRun(servername)) { return 0; } m_server = new QLocalServer; // 先移除原来存在的,如果不移除那么如果 // servername已经存在就会listen失败 QLocalServer::removeServer(servername); // 进行监听 m_server->listen(servername); connect(m_server, SIGNAL(newConnection()), this, SLOT(newConnection())); return 1; } 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(1000)){ ls.disconnectFromServer();// 说明已经在运行了 ls.close(); return 1; } return 0; } 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 1; } QObject::connect(&s, SIGNAL(newMessage(const QString &)),&text, SLOT(setText(const QString &))); text.show(); return app.exec(); } 用于测试的客户端代码, 每一秒向server发送一个随机数: #include <QLoacalSocket> #include <stdlib.h> #include <unistd.h> int main(int argc, char **argv) { QLocalSocket ls; ls.connectToServer("localserver-test"); srandom(1000); if (ls.waitForConnected()){ while (1){ QTextStream ts(&ls); ts << QString::number(random()) + "\nTTTTTTTTTT" + "\nXXXXXXXX"; ts.flush(); ls.waitForBytesWritten(); sleep(1); } } return 0; }
先运行server程序, 然后运行测试用的客户端…
本来参照 http://www.aiuxian.com/article/p-3105197.html
http://blog.chinaunix.net/uid-20718335-id-1993073.html 加以修改和实现
相关文章推荐
- MKMapItem openMapsWithItems调用系统的导航
- nyoj 236 心急的C小加
- 如何更改nagios监控默认的检查时间
- SSIS 错误代码 DTS_E_CANNOTACQUIRECONNECTIONFROMCONNECTIONMANAGER
- 【架构】微服务系列文章
- iOS-随心所欲控制button内image view和title view的位置
- 待整理文章
- SQL优化:设置性能相关的服务器参数
- Java面试题(04)
- hibernate4在执行sql时出现nested transactions not supported
- iOS本地数据存储都有哪几种方式?iOS如何实现复杂对象的存储?
- 简单的实现弹幕效果
- JAXB - XML Schema Types, Defining Types for XML Elements With Content
- Python 技巧总结
- mysql root密码忘记
- Rollout学习2 JS和OC代码对照篇
- Salesforce 如何把签卡数据同步到中控系统
- MySql数据库安装&修改密码&开启远程连接图解
- JavaScript生成GUID的算法
- 思考:为什么内链是不可或缺的?!